[JAVA] Optional

펭귄안녕·2024년 10월 23일

JAVA

목록 보기
8/9
post-thumbnail

1.

of(),Nullable()

public class Optional_1 {
    public static void main(String[] args) {
        String str1="떡볶이";
        String str2=null;

        // 객체를 Optional 상자에 넣기
        Optional<String> op1 = Optional.of(str1); // null을 허용하지 않을 객체
        Optional<String> op2 = Optional.ofNullable(str2); // null을 허용할 객체

        if (op1.isPresent()) {
            //isPresent() : 상자에 데이터가 존재하는지 확인

            System.out.println(op1.get()); // get() : 상자의 데이터 읽기

        }

        if (op2.isPresent()) {
            //isPresent() : 상자에 데이터가 존재하는지 확인

            System.out.println(op2.get()); // get() : 상자의 데이터 읽기

        }
    }
}

2.

public class Optional_2 {
    public static void main(String[] args) {

        Optional<String> op1=Optional.of("떡볶이");
        Optional<String> op2=Optional.ofNullable(null);

        // 데이터가 존재할 때 어떤 내용을 실행할지 작성하는 메서드
        // ifPresent() 메서드의 매개변수 : Consumer<T>
        // Consumer<T> -> void x(T t)
        op1.ifPresent(str-> System.out.println(str));
        op2.ifPresent(str-> System.out.println(str));

    }
}

3.

map()

내용 실행 결과를 다시 Optional 상자에 담아서 리턴

public class Optional_3 {
    public static void main(String[] args) {

        Optional<String> op = Optional.of("Kim Bap");

        // Function<T> -> R x(T t)
        Optional<String> result1 = op.map((str)->str.toLowerCase());
        System.out.println(result1.get());

        String result2 = op.map(str->str.toLowerCase()).get();

        // ------

        Optional<String> op2=Optional.of("Kim Bap");

        // 대문자로 바꾸고 . 공백을 공백 없는 걸로 교체
        String result3=op2.map(str->str.toUpperCase()).map(str->str.replace(" ","")).get();
        System.out.println(result3);


    }
}

4.

orElse()

  • map() 함수에 이어서 orElse() 메서드를 사용하면 데이터가 null 일 때 실행 내용을 작성할 수 있다.
  • 주의사항 : orElse() 메서드까지 사용하면 리턴타입은 Optional이 아니라 데이터가 리턴된다.
public class Optional_4 {
    public static void main(String[] args) {

        Optional<String> op=Optional.of("KimBap");

        String result = op.map(s->s.toString()).orElse("empty data");
        System.out.println(result);


    }
}

5.

ifPresentOrElse()

  • 첫번째 매개변수 Consumer< T> -> void X (T t) : 데이터가 존재할 때
  • 두번째 매개변수 Runnable< T> -> void run() : 데이터가 존재하지 않을 때
public class Optional_5 {
    public static void main(String[] args) {
        MemberVO member=new MemberVO("고길동",43);

        Optional<MemberVO> op1=Optional.of(member);

        // 회원 정보가 null이 아니면 회원의 이름을 출력
        if (member!=null){
            System.out.println(member.getName());
        }

        op1.ifPresent(m-> System.out.println(m.getName()));

        
        
        op1.ifPresentOrElse(
                mem-> System.out.println(mem.getName())
                , ()-> System.out.println("회원의 이름 정보가 없습니다.") );

    }

}

6.

public class BoardServiceImpl {
    private List<BoardVO> boardList;

    public BoardServiceImpl(){
        boardList = new ArrayList<>();
        boardList.add(new BoardVO(1,"첫번째 글"));
        boardList.add(new BoardVO(2,"두번째 글"));
        boardList.add(new BoardVO(3,"세번째 글"));
    }

    public Optional<List<BoardVO>> getBoardList(){
        return Optional.ofNullable(boardList);
    }

    public Optional<BoardVO> getBoardDetail(int index){
        return Optional.ofNullable(boardList.get(index));
    }

}
public class BoardController {
    private BoardServiceImpl boardService;

    public BoardController(){
        this.boardService=new BoardServiceImpl();
    }

    // 게시글 목록 데이터 조회
    public Optional<List<BoardVO>> boardList(){
        Optional<List<BoardVO>> optionalList=boardService.getBoardList();
//        optionalList.ifPresentOrElse(()->{},()=>{});

        return Optional.ofNullable(boardService.getBoardList().get());

    }


    // 게시글 상세 정보 조회
    public BoardVO boardDetail(){
        Optional<BoardVO> op=boardService.getBoardDetail(0);

        op.ifPresentOrElse( member->{
            System.out.println("게시글 제목 : " +member.getTitle());
        } ,()->{
            System.out.println("404 NOT FOUND");
        });
        return boardService.getBoardDetail(0).get();
    }

}

00.

main

public static void main(String[] args) {
	ContactInfo contact = new ContactInfo("01011112222", "제주도");
	Company c = new Company("삼성", contact);
	Friends f = new Friends("고길동", c);

	originPrint(f);


	Optional<Friends> optional = Optional.ofNullable(f);
    
	optionalPrint(optional);
    }

기존 방식 코드 : 주소 출력

public static void originPrint(Friends f){
	String addr = null;
    if (f!=null){
    	Company c=f.getCompany();
    	if (c!=null){
    		ContactInfo contact=c.getContactInfo();
    		if (contact!=null){
    			addr = contact.getAddr();
    		}
    	}
    }
    if (addr!=null){
    	System.out.println(addr);
    }
    else {
    	System.out.println("주소를 찾을 수 없습니다.");
    }

}

Optional 사용 코드

public static void optionalPrint(Optional<Friends> optional){
	// Function<T> -> R apply(T t)
    String addr = optional.map(friends->friends.getCompany()) // Company 객체가 상자에 들어감
                .map(company -> company.getContactInfo()) // ContactInfo 객체가 상자에 들어감
                .map(contactInfo -> contactInfo.getAddr()) // String addr 들어감
                .orElse("주소를 찾을 수 없습니다.");

	System.out.println(addr);
}

콘솔창

하나라도 null을 포함하게 될 시에는 이렇게 출력된다.

0개의 댓글