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 는 존재 할 때만 출력
	
    }
}