-
<Java> Stream OptionalJava 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 는 존재 할 때만 출력 } }
'Java' 카테고리의 다른 글
< Java > EscapeSequence ( 특수문자, 이스케이프 문자) (0) 2023.08.26 < Java > String (0) 2023.08.25 < Java > Stream (0) 2023.08.25 < Java > lamda (0) 2023.08.24 <Java> Operator( 연산자 ) (0) 2023.08.24