Modern Java Stream 정리3

Published: by Creative Commons Licence

Optional 생성 및 내부객체 접근

Optional은 제네릭 클래스로 객체를 감싸는 래퍼 클래스이다.
Optional 타입의 객체에는 모든 타입의 참조변수를 담을 수있다.
Optional 클래스는 null 값을 처리할 때 많이 활용된다.

Optional.of를 사용해서 String의 래퍼클래스로 생성하고 Optional.get을 사용해서 Optional객체 내부의 String객체에 접근한다.

public static void basic1(){
    String value = "This is Optional";
    Optional<String> optionalStr = Optional.of(value);
    System.out.println("basic1 result : " + optionalStr.get());
}

null을 포함하는 Optional 객체 생성

Optional.of()는 null이 아닌 객체만 사용하다.
null값을 포함하는 객체를 Optional 객체를 래퍼클래스로 생성하기 위해서는 아래 두가지 방법이 있다.

public static void basic2(){
    // 방법1 - Optional.ofNullable
    String nullValue = null;
    Optional<String> nullOptionalStr = Optional.ofNullable(nullValue);
    try{
        System.out.println(nullOptionalStr.get());
    }catch(Exception e){
        e.printStackTrace();
    }
}
public static void basic3(){
    // 방법2 - Option.empty
    Optional<String> nullOptionalStr = Optional.empty();
    try{
        System.out.println(nullOptionalStr.get());
    }catch(Exception e){
        e.printStackTrace();
    }
}

isPresent(),ifPresent() 내부 객체 존재 여부확인

public static void basic4(){
    Optional<String> optionalStr = Optional.of("This is not null String");
    Optional<String> nullOptionalStr = Optional.ofNullable(null);

    if (optionalStr.isPresent()) {
        System.out.println("optionalStr: " + optionalStr.get());
    }
    optionalStr.ifPresent(str -> System.out.println("optionalStr[ifPresent] : " + optionalStr.get()));

    if (nullOptionalStr.isPresent()) {
        System.out.println("nullOptionalStr[isPresent]: " + nullOptionalStr.get());
    }
    nullOptionalStr.ifPresent(str -> System.out.println("nullOptionalStr[ifPresent] : " + nullOptionalStr.get()));
}

orElse - Optional이 null인 경우 orElse()의 param을 리턴

public static void basic5(){
    Optional<String> optionalStr = Optional.of("This is not null String");
    Optional<String> nullOptionalStr = Optional.ofNullable(null);

    String optionalStr2 = optionalStr.orElse("optionalStr 대체 String 입니다.");
    String nullOptionalStr2 = nullOptionalStr.orElse("nullOptionalStr 대체 String 입니다.");

    System.out.println("optionalStr2 : " + optionalStr2);           // This is not null String
    System.out.println("nullOptionalStr2 : " + nullOptionalStr2);   // nullOptionalStr 대체 String 입니다.
}

orElseGet - Optional이 null인 경우 특정 함수를 실행하고 그 결과를 리턴

public static void basic6(){
    Optional<String> optionalStr = Optional.of("This is not null String");
    Optional<String> nullOptionalStr = Optional.ofNullable(null);

    String optionalStr2 = optionalStr.orElseGet(() -> "[orElseGet] This is not null String");
    String nullOptionalStr2 = nullOptionalStr.orElseGet(() -> "[orElseGet] This is null String");

    System.out.println("optionalStr2 : " + optionalStr2);// This is not null String
    System.out.println("nullOptionalStr2 : " + nullOptionalStr2); // [orElseGet] This is null String
}

orElseThrow - Optional이 null인 경우 예외를 던진다.

public static void basic7(){
    Optional<String> optionalStr = Optional.of("This is not null String");
    Optional<String> nullOptionalStr = Optional.ofNullable(null);

    try{
        String optionalStr2 = optionalStr.orElseThrow(() -> {throw new NullPointerException();});
        System.out.println("optionalStr2 : " + optionalStr2);
    }catch(NullPointerException e){
        System.err.println("NullPointerException");
    }

    try{
        String nullOptionalStr2 = nullOptionalStr.orElseThrow(() -> {throw new NullPointerException();});
        System.out.println("nullOptionalStr2 : " + nullOptionalStr2);
    }catch(NullPointerException e){
        System.err.println("NullPointerException");
    }
}

참고

Java8의 Optional 사용 방법 및 예제
자바의 정석 - 스트림(Stream)

Github

https://github.com/sisipapa/ModernJava.git