Hello

Java Optional

by 볼빵빵오춘기

Optional <T>

T타입 객체의 래퍼클래스 - Optional <T>

T 에 모든 종류의 객체 저장가능 ⇒ null 도 가능

null을 직접다루는 것은 위험 why? NullpointException 발생가능

null 체크 > if문 필수 > 코드가 지저분해짐

⇒ 위의 문제를 해결하기 위해 사용한다.

더보기

예를 들면,

Object result = getResult();

위의 코드를 보면 반환값은 null 또는 객체 가 반환될것이다. 

if(result!= null)
	println(result.toString());

그렇기 때문에 이런 문제를 해결하고자 Optional <T>사용한다.

null 값을 직접 다루는 것이 아니라 Optional 객체에 null을 넣는다.

따라서 result는 null이지만 null이 아닌것이 된다.

 

Optional <T> 객체 생성하기

Optional <T>객체를 생성하는 다양한 방법

 

 null 대신 빈 Optional <T>객체를 사용하자!

 

Optional <T> 객체의 값 가져오기

  • Optional 객체의 값 가져오기 - get(), orElse(), orElseGet(), orElseThrow()
  • isParesent() - Optional 객체의 값이 null이면 false, 아니면 true를 반환한다.

 

예제 코드

더보기
package ch14Try;

import java.util.Optional;

public class Ex14_0 {

	public static void main(String[] args) {
		//int[] arr = null // error
		int[] arr = new int[0];
		System.out.println(arr.length);
		
		// Optional<String> opt = null; // 에러가 나지는 않지만 바람직하지 않음 
		Optional<String> opt = Optional.empty();
		System.out.println(opt);
		
		String str ="";
		
//		try {
//			str = opt.get();
//		}catch(Exception e) {
//			str = ""; // 예외가 발생하면 빈문자열("")로 초기
//		}
		
		str = opt.orElse("EMPTY");
		System.out.println(str);
		

	}

}
과값
0
Optional.empty
EMPTY

 

OptionalInt, OptionalLong, OptionalDouble

  • 기본형 값을 감싸는 래퍼 클래스이다.
  • OptionalInt의 값 가져오기 - int getAsInt()

※ 빈 Optional객체와의 비교

OptionalInt opt = OptionalInt.of(0); // Optional에 0을 저장
OptionalInt opt2 = OptionalInt.empty; // Optional에 0을 저장

 

예제 코드

더보기
import java.util.Optional;
import java.util.OptionalInt;

public class Ex14_0 {

	public static void main(String[] args) {
		Optional<String>  optStr = Optional.of("abcde");
		Optional<Integer> optInt = optStr.map(String::length);
		System.out.println("optStr="+optStr.get());
		System.out.println("optInt="+optInt.get());

		int result1 = Optional.of("123")
						    .filter(x->x.length() >0)
						    .map(Integer::parseInt).get();

		int result2 = Optional.of("")
						    .filter(x->x.length() >0)
						    .map(Integer::parseInt).orElse(-1);

		System.out.println("result1="+result1);
		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.isPresent());   // true
		System.out.println(optInt2.isPresent());   // false

		System.out.println(optInt1.getAsInt());  // 0
//		System.out.println(optInt2.getAsInt());  // NoSuchElementException
		System.out.println("optInt1="+optInt1);
		System.out.println("optInt2="+optInt2);
	  	System.out.println("optInt1.equals(optInt2)?"+optInt1.equals(optInt2));

	}

}
optStr=abcde
optInt=5
result1=123
result2=-1
result3=456
true
false
0
optInt1=OptionalInt[0]
optInt2=OptionalInt.empty
optInt1.equals(optInt2)?false

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기