Java
<Java> Stream Optional
98kg
2023. 8. 25. 14:03
Optional
스트림 종류의 하나로써 특정 타입의 스트림 요소의 결과를 받아서 집계, 요소 존재여부,
요소가 없을 시의 처리 여부 등을 consumer(람다) 를 통해 정의 할 수 있는 클래스입니다.
재밌는 것은, 만약 컬렉션의 요소가 동적으로 추가 되거나 삭제 될 때, 추가 시에는 상관없지만
삭제되어 아무것도 존재하지 않는 상태에서 요소를 get하게되면 예외가 발생할 수 있는데,
이때를 대비해 메서드를 제공해서 에외를 발생하지 않으면서도 다음 처리 작업을 할 수 있도록 정의 되어있습니다.
Optional Method
대표적인 메서드만 알아보겠습니다.
- isPresent() : 요소가 존재하는지의 여부를 리턴
- orElse() : 요소가 없는 경우, 즉 집계함수 없는 경우를 대비, default 값을 정의 할 수 있음
- ifPresent(): 요소가 존재하는 경우에만 동작하는 람다를 제공하는 메서드이다.
하위 코드는 일부러 없는 요소를 집계하면서 예외를 발생시킨 예제입니다.
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import org.apache.tomcat.jni.Sockaddr;
public class OptionalEx {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(); // 빈 요소의 컬렉션 생성
double avg = list.stream()
.mapToInt(Integer :: intValue) // value -> Integer.intValue(value)
.average()
.getAsDouble();
System.out.println(avg); // 요소가 없는 컬렉션을 집계 하려 했기때문에 no value present 라는 예외가 뜬다.
하위 코드는 일부로 없는 요소를 집계하면서 예외를 발생시키지 않고 출력 하는 코드 예제입니다.
package firstWeb.Lamda;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.OptionalDouble;
import org.apache.tomcat.jni.Sockaddr;
public class OptionalEx {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(); // 빈 요소의 컬렉션 생성
OptionalDouble optionalDouble = list.stream()
.mapToInt(Integer :: intValue)
.average();
if (optionalDouble.isPresent()) {
// 요소가 존재하면 true 아니면 false
System.out.println("평균 : "+ optionalDouble.getAsDouble());
}else {
System.out.println("(isPresent() 이용) : 등록된 점수가 없습니다.");
}
// 다른 예
double avg = list.stream()
.mapToInt(Integer :: intValue) // value -> Integer.intValue(value)
.average()
.orElse(0.0);
System.out.println("(orElse() 이용) 평균 : " + avg);
//3번쨰 예
list.stream().mapToInt(Integer::intValue)
.average()
.ifPresent(value ->System.out.println("평균 : " + value)); // ifPresent 는 존재 할 때만 출력
}
}