https://hbase.tistory.com/212
https://mangkyu.tistory.com/70
https://mangkyu.tistory.com/203
NPE(NullPointerException) 방지가 주된 목적인 Wrapper 클래스
결과값에 null이 올수 있고, null 로 인해서 오류가 발생할 가능성이 있을때 사용하면 된다.
Wrapper 클래스 이기때문에 많이사용하면 성능 저하가 발생할 수 있음
또한 NPE 대신 NoSuchElementException 오류가 발생 할 수 있음
Optinal.empty() : 데이터가 없는 빈 Optinal 객체 생성
Optional.ofNullable(data) : 데이터가 없을 경우 빈 객체 생성
Optional.of(data) : 반드시 데이터가 있어야 하며, 없을 경우 NPE 발생
get() : 데이터를 가져오며, 없을경우 null 을 가져옴
orElse() : 가져오려는 데이터가 없을 경우 지정한 값을 가져옴
Supplier<T> 인터페이스를 활용하여 orElseGet()메소드 사용
Supplier<T> 인터페이스를 활용하여 orElseThrow()메소드 사용 (데이터가 없는 경우 지정한 예외 발생)
테스트 코드
=================================================================================================================
package com.sungchul;
import java.io.*;
import java.util.*;
public class OptionalTestClass {
public static void main(String[] args) throws NumberFormatException, IOException {
ClassName<String,Integer> className = new ClassName<>();
//빈 객체 생성
Optional<ClassName> optionalClassNameTest1 = Optional.empty();
//값에 null이 오면 빈객체가, null 이 아니면 지정한 값이 들어간 객체가 생성
Optional<ClassName> optionalClassNameTest3 = Optional.ofNullable(className);
//값에 null이 오면 NullPointerException 발생
//Optional<String> optionalClassNameTest2 = Optional.of(className.getTest1());
className.set("문자열",12345);
className.setTest1("김성철");
Optional<ClassName> optionalClassNameTest4 = Optional.ofNullable(className);
//orElse 는 값이 없다면 다음괄호 안에 있는 값을 사용한다
String test = optionalClassNameTest4.map(ClassName::getTest1).orElse("값없음");
System.out.println("#### test : " + test);
//아래와같이 ifPresent 함수를 사용하여서 null일경우 값을 넣어줄수 있다
// null 출력
Optional.of(className)
.map(ClassName::getTest2)
.ifPresent(n-> className.setTest2(n));
System.out.println("#### Null test2 : "+ className.getTest2());
//test1의 값을 test2에 입력
Optional.of(className)
.map(ClassName::getTest1)
.ifPresent(n-> className.setTest2(n));
System.out.println("#### Not null test2 : "+ className.getTest2());
}
}
class ClassName<K,V> {
private K first;
private V second;
private String test1;
private String test2;
void set(K first , V second){
this.first=first;
this.second=second;
}
K getFirst(){
return first;
}
V getSecond(){
return second;
}
void setTest1(String test1){
this.test1 = test1;
}
String getTest1(){
return test1;
}
public String getTest2() {
return test2;
}
public void setTest2(String test2) {
this.test2 = test2;
}
String toLowerCase(){
return "소문자변환";
}
}
=================================================================================================================