매칭(matching)
은 요소가 조건에 맞는지 여부를 반환하는 최종 처리입니다. 매칭
을 수행하기 위한 메소드는 다음과 같습니다.
메소드 | 설명 |
---|---|
boolean allMatch(Predicate) | 모든 요소가 조건에 맞는지 여부를 반환 |
boolean anyMatch(Predicate) | 최소 한 개의 요소가 조건에 맞는지 여부를 반환 |
boolean noneMatch(Predicate) | 모든 요소가 조건을 만족하지 않는지 여부를 반환 |
Predicate
는 전에도 언급했지만 매개변수를 검사해서 boolean 타입을 return하는 함수형 인터페이스입니다.
다음 코드는 매칭 예제 코드입니다. 스트림 내의 모든 요소가 홀수인지를 판별하는 것과 홀수가 하나라도 있는지를 판별합니다.
public class Main {
public static void main(String[] args) {
boolean result = true;
int[] arr = { 1, 2, 3, 4, 5 };
IntStream stream1 = Arrays.stream(arr);
//스트림의 모든 요소가 홀수인지 판별
result = stream1.allMatch(elem -> elem % 2 == 1);
System.out.println(result);
IntStream stream2 = Arrays.stream(arr);
//스트림의 요소 중 홀수가 하나라도 있는지 판별
result = stream2.anyMatch(elem -> elem % 2 == 1);
System.out.println(result);
}
}
집계(Aggregate)
는 요소를 처리해서 요소 카운트, 평균, 총합 등의 의미있는 값으로 만드는 것을 의미합니다. 집계
에는 스트림에서 기본적으로 제공하는 메소드를 사용할 수도 있고, 사용자가 원하는 집계 방식을 작성할 수 있는 방식도 제공하고 있습니다.
요소 카운트, 최대, 최소, 평균, 총합은 스트림에서 제공하는 기본 메소드로 처리할 수 있습니다/
메소드 | 설명 |
---|---|
long count() | 요소 총 개수 반환 |
OptionalXxxxx findFirst() | 첫 번째 요소 반환 |
OptionalXxxxx max() OptionalXxxxx min() | 최대 요소, 최소 요소 반환 |
OptionalDouble average() | 요소의 평균 반환 |
int/long/double sum() | 요소의 총합 반환 |
반환타입 OptionalXxxxx
는 클래스로 Double, Long, Int
가 올 수 있습니다. 이 타입으로 반환되는 값은 각각 Optional -> get()
, OptionalDouble -> getAsDouble()
, OptionalLong -> getAsLong()
, OptionalInt -> getAsInt()
를 사용해야 최종적인 값을 얻을 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
IntStream stream1 = Arrays.stream(arr);
//요소 개수 카운트
long cnt = stream1.count();
System.out.println("요소 개수: " + cnt);
IntStream stream2 = Arrays.stream(arr);
//요소 평균
Double avg = stream2.average().getAsDouble(); //반드시 getAsDouble로 값 취득
System.out.println("요소 평균: " + avg);
IntStream stream3 = Arrays.stream(arr);
//요소 총합
int sum = stream3.sum();
System.out.println("요소 총합: " + sum);
}
}
스트림에서 기본 제공하는 집계 외에 원하는 집계 방식이 있을 경우 커스텀을 위해서 reduce()
메소드를 제공하고 있습니다.
다음 코드는 reduce()
를 이용해서 sum()
을 구현한 메소드입니다.
public class Main {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
IntStream stream = Arrays.stream(arr);
long cnt = stream.reduce(0, (x, y) -> x + y);
System.out.println("요소 총합: " + cnt);
}
}
여기서 reduce()
를 보시면 reduce(0, (x, y) -> x + y)
라고 구현했는데요. 앞의 0
은 identify
라고 해서 예외가 발생하면 반환하는 값입니다. 예외 상황이 발생했을 때 identify
를 적지 않았다면 NoSuchElementException
예외를 반환하고 identify
가 있다면 해당 값을 반환합니다.
집계 반환 타입인 Optional
클래스는 집계값을 저장하는 것 외에도 여러가지 동작을 합니다. 동작하지 않았다면 굳이 Optional
타입으로 반환할 이유가 없겠죠.
Optional
클래스에서 지원하는 메소드는 다음과 같습니다.
메소드 | 설명 |
---|---|
isPresent() | 집계값이 있는지 여부를 반환 |
orElse(x) | 집계값이 없을 경우 기본값 x 설정 |
ifPresent(Consumer) | 집계값이 있을 경우 Consumer로 처리 |
Consumer
는 매개변수 값을 처리해서 반환한느 함수형 인터페이스입니다.
Optional
클래스의 적정한 조작을 이용하면 예외 발생 상황에 대처할 수 있게됩니다.