Optional<T>
T value
: 모든 종류의 객체 저장 가능, null까지!!!null
다루기null
을 직접 다루는 것은 위험하기 때문에(NullPointException)Optional<T>
객체 생성하기Optional.of(T t)
String str = "abc"; Optional<String> optVal = Optional.of(str);`
Optional
객체의 값value == str의 값value결국 위의 방식이 아래 방식으로
Optional<String> optVal = Optional.of("abc");
이렇게 한줄로 줄일 수 있다.
Optional.ofNullable(null)
Optional<String> optVal = Optional.ofNullable(null);
Optional.empty()
Optional<String> optVal = Optional.empty();
빈 객체로 초기화
빈 Optional<T>
객체를 사용하자Optional<String> optVal = null; //(X) 널로 초기화는 바람직하지 않음 Optional<String> optVal = Optional.<String>empty(); //(O) 빈 객체로 초기화 Optional<String> optVal = Optional.empty(); //(O)
Optional<T>
객체의 값 가져오기orElse(T other)
public T orElse(T other) { return value != null ? value : other; }
value
반환null
이면 other
반환예)
Optional<String> opt = Optional.empty();
System.out.println("opt= "+opt.orElse("EMPTY"));
opt= EMPTY
orElseGet(람다식)
public T orElseGet(Supplier<? extends T> supplier) { return value != null ? value : supplier.get(); }
value
반환null
이면 Supplier람다식 반환예)
Optional<String> opt = Optional.empty();
System.out.println("opt= "+opt.orElseGet(()->"EmPtY"));
System.out.println("opt= "+opt.orElseGet(()->new String()));
System.out.println("opt= "+opt.orElseGet(String::new));
opt= EmPtY
opt=
opt=
isPresent()
public boolean isPresent() { return value != null; }
ifPresent(람다식)
public void ifPresent(Consumer<? super T> action) { if (value != null) { action.accept(value); } }
ex14_08_0
import java.util.Optional;
public class Ex14_08_0 {
public static void main(String[] args) {
// int[] arr = null; //NullPointerException 하지 말자!!!
int[] arr = new int[0]; //이렇게 초기화 하는 게 좋다!!
System.out.println("arr.length= "+arr.length);
// Optional<String> opt = null; //하지 말자!!!
Optional<String> opt = Optional.empty();
// Optional<String> opt = Optional.of("abc"); //아래 다 abc
// System.out.println("opt= "+opt.get()); //null이면 예외발생. 하지 말자!!!
System.out.println("opt= "+opt.orElse("EMPTY"));
System.out.println("opt= "+opt.orElseGet(()->"EmPtY"));
System.out.println("opt= "+opt.orElseGet(()->new String()));
System.out.println("opt= "+opt.orElseGet(String::new));
}
}
arr.length= 0
opt= EMPTY
opt= EmPtY
opt=
opt=
Optional<T>
보다 성능을 높인 것OptionalInt opt1 = OptionalInt.of(0); //OptionalInt에 0 저장
OptionalInt opt2 = OptionalInt.empty(); //OptionalInt에 0 저장
System.out.println(opt1.isPresent()); //true
System.out.println(opt2.isPresent()); //false
System.out.println(opt1.Equals(opt2)); //true
value == 0
일 경우 이게 값이 0인지, 빈 객체인지 알 수 없다.boolean isPresent
로 구분한다!!isPresent == true
: Optional객체가 갖는 값? == 0isPresent == false
: Optional객체는 비어있다.ex14_08
import java.util.Optional;
import java.util.OptionalInt;
public class Ex14_08 {
public static void main(String[] args) {
Optional<String> strOpt = Optional.of("abcde");
Optional<Integer> intOpt = strOpt.map(String::length);
//s->s.length()
System.out.println("strOpt= "+strOpt.orElse("empty")); //null아니면 get()도 됨
System.out.println("intOpt= "+intOpt.get());
int result1 = Optional.of("123")
.filter(s->s.length()>0) //***Optional에도 filter(),map()이 있다!!!
.map(Integer::parseInt)
.get();
System.out.println("result1= "+result1);
int result2 = Optional.of("")
.filter(s->s.length()>0)
.map((s)->Integer.parseInt(s))
.orElse(-1); //길이가 0이하면("") 이면 -1 반환
System.out.println("result2= "+result2);
Optional.of("456").map(Integer::parseInt)
.ifPresent(x->System.out.printf("result3= %d%n",x));
OptionalInt optInt1 = OptionalInt.of(0); //0
OptionalInt optInt2 = OptionalInt.empty(); //빈 객체
System.out.println("optInt1의 value= "+optInt1.getAsInt());
// System.out.println(optInt2.getAsInt()); //NoSuchElementException
System.out.println("optInt2의 value= "+optInt2.orElse(-999));
System.out.println("optInt1.toString()= "+optInt1.toString());
System.out.println("optInt2.toString()= "+optInt2);
System.out.println("optInt1.equals(optInt2)? "+optInt1.equals(optInt2));
}
}
strOpt= abcde
intOpt= 5
result1= 123
result2= -1
result3= 456
optInt1의 value= 0
optInt2의 value= -999
optInt1.toString()= OptionalInt[0]
optInt2.toString()= OptionalInt.empty
optInt1.equals(optInt2)? false