JAVA4_10_Optional<T>

charl hi·2021년 10월 10일
0

JAVA4

목록 보기
10/13

링크텍스트

Optional<T>

  • T 타입 객체의 래퍼클래스

  • T value : 모든 종류의 객체 저장 가능, null까지!!!

역할

  1. 간접적으로 null 다루기
  • null을 직접 다루는 것은 위험하기 때문에(NullPointException)
  • 직접 다룰 경우, null체크를 하려면 if문이 필수인데, 코드가 지저분해진다.




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();

빈 객체로 초기화



null 대신 빈 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;
}
  • Optional객체에 저장된 값value 반환
  • Optional객체에 저장된 값이 ✨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();
}
  • Optional객체에 저장된 값value 반환
  • Optional객체에 저장된 값이 ✨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;
}

  • Optional객체의 값이 null이면 false, 아니면 true를 반환
  • 뭔가 있으면 true

참고: ifPresent(람다식)

public void ifPresent(Consumer<? super T> action) {
	if (value != null) {
		action.accept(value);
	}
}

  • 값이 null이 아닐 때만 작업 수행
  • 뭔가 있으면 작업 수행
  • null이면 아무 일도 안함


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= 



OptionalInt, OptionalLong, OptionalDouble

  • 기본형 값을 감싸는 래퍼클래스
  • Optional<T>보다 성능을 높인 것

OptionalInt..의 값 가져오기



빈 객체 vs. 값==0

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객체가 갖는 값? == 0
    -> isPresent == false : Optional객체는 비어있다.


ex14_08

  • ✨✨Optional에도 filter(),map()이 있다!!!
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



Ref

0개의 댓글