[Java] 요소 최종 처리 - 매칭, 집계

Bam·2024년 3월 20일
0

Java

목록 보기
84/98
post-thumbnail

매칭

매칭(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)라고 구현했는데요. 앞의 0identify라고 해서 예외가 발생하면 반환하는 값입니다. 예외 상황이 발생했을 때 identify를 적지 않았다면 NoSuchElementException 예외를 반환하고 identify가 있다면 해당 값을 반환합니다.

Optional 클래스

집계 반환 타입인 Optional 클래스는 집계값을 저장하는 것 외에도 여러가지 동작을 합니다. 동작하지 않았다면 굳이 Optional 타입으로 반환할 이유가 없겠죠.

Optional 클래스에서 지원하는 메소드는 다음과 같습니다.

메소드설명
isPresent()집계값이 있는지 여부를 반환
orElse(x)집계값이 없을 경우 기본값 x 설정
ifPresent(Consumer)집계값이 있을 경우 Consumer로 처리

Consumer는 매개변수 값을 처리해서 반환한느 함수형 인터페이스입니다.

Optional 클래스의 적정한 조작을 이용하면 예외 발생 상황에 대처할 수 있게됩니다.

0개의 댓글