Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 스트림 filter를 활용한 리스트 합계 구하기

Java에서는 Stream API의 filter()mapToInt(), sum() 메서드를 조합하면 리스트에서 특정 조건을 만족하는 요소만 골라 그 합계를 손쉽게 계산할 수 있습니다.

예제 코드

import java.util.*;
public class Demo
{
    public static void main(String[] args)
    {
        List<Integer> my_list = new ArrayList<Integer>();
        my_list.add(11);
        my_list.add(35);
        my_list.add(56);
        my_list.add(78);
        my_list.add(91);
        System.out.println(sum(my_list));
    }
    public static int sum(List<Integer> my_list)
    {
        System.out.println("메인 함수에서 필터가 적용된 리스트의 합계: ");
        return my_list.stream().filter(i -> i > 5).mapToInt(i -> i).sum();
    }
}

실행 결과

메인 함수에서 필터가 적용된 리스트의 합계:
271

코드 동작 원리

위 코드의 동작 과정을 단계별로 살펴보면 다음과 같습니다.

1. 리스트 생성 및 요소 추가

Demo 클래스의 main 메서드에서는 ArrayList 객체를 생성합니다. 이후 add() 메서드를 사용해 5개의 정수 값(11, 35, 56, 78, 91)을 순차적으로 추가합니다.

2. sum() 메서드 호출

별도로 정의된 sum() 메서드에 리스트를 전달하여 호출합니다. 이 메서드는 스트림 연산의 결과로 계산된 합계를 반환합니다.

3. 스트림 파이프라인 처리

핵심 로직은 my_list.stream().filter(i -> i > 5).mapToInt(i -> i).sum() 부분입니다.

  • stream(): 리스트를 스트림으로 변환하여 데이터 처리 파이프라인을 시작합니다.
  • filter(i -> i > 5): 람다 표현식을 활용해 5보다 큰 요소만 통과시킵니다. 이 예제에서는 모든 요소가 5보다 크므로 전체가 유지됩니다.
  • mapToInt(i -> i): Stream<Integer>를 기본형 특화 스트림인 IntStream으로 변환합니다. 이렇게 하면 불필요한 오토박싱을 피할 수 있습니다.
  • sum(): 최종적으로 모든 요소의 합계를 계산하여 반환합니다.

결과적으로 11 + 35 + 56 + 78 + 91 = 271이 출력되며, 만약 필터 조건이 더 엄격해지면(예: 50보다 큰 값) 해당 조건을 만족하는 요소들의 합만 계산됩니다.