[JAVA] Stream API

12·2026년 3월 12일

자바

목록 보기
8/8

스트림은 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리한다.
스트림은 데이터 처리에 중점을 둔다.

1.스트림은 람다식으로 데이터를 처리한다.
2.스트림은 자바에서 제공하는 유용한 메서드(+ 함수형 인터페이스)들을 사용한다.

스트림은 중간연산과 최종연산으로 나뉜다.
중간연산의 경우 stream을 다시 return하며,
최종연산은 stream이 아닌것을 반환한다.

중간연산의 종류

1.filter() -stream에서 조건이 맞는 데이터만을 정제하여 더 작은 컬렉션을 만드는데 사용한다. 새로운 stream을 만들어낸다.

import java.util.stream.Stream;

public class FilterDemo {

	public static void main(String[] args) {
		Stream.of("a1", "b1", "b2", "c1", "c2", "c3")
        .filter(s -> s.startsWith("c")).skip(1) 
		.forEach(System.out::println);

	}

}

2.map() - 기존의 stream 요소들을 대체하는 요소로 구성된 새로운 stream을 만들어낸다.

import java.util.List;
import java.util.stream.Collectors;

public class StreamMapExample {
    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie");

        // 각 이름을 대문자로 변환
        List<String> upperNames = names.stream()
        .map(name -> name.toUpperCase())  // map으로 변환
        .collect(Collectors.toList());   // 최종 연산

        System.out.println(upperNames); // 출력: [ALICE, BOB, CHARLIE]

3.sorted()- Stream의 요소들을 정렬하기 위해 사용한다. 인자 없이 호출할 경우 오름차순 정렬이다.

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class SortedEx {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        // 오름차순 정렬
        list.stream()
            .sorted()
            .forEach(System.out::print);

4.peek() - forEach()처럼 요소를 하나씩 돌며 출력하지만, 중간연산이다.
(forEach()는 최종연산)

import java.util.Arrays;
import java.util.List;

public class PeekEx {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

        int result = list.stream()
            .filter(num -> num % 2 == 0)
            .peek(num -> System.out.println(num))

5.limit() -- ()안의 숫자만큼 요소들을 가져와 새로운 스트림을 형성한다.

public class LimitEx {
    public static void main(String[] args) {
        IntStream intStream = IntStream.rangeClosed(1, 10);
        intStream.limit(5)	//1,2,3,4,5
            .forEach(System.out::println);
    }
}

최종연산- 연산결과가 스트림이 아니므로, 한번만 연산이 가능하다.

  1. forEach() - 모든 요소들을 하나씩 처리한다.

public class FilterDemo {

	public static void main(String[] args) {
		Stream.of("a1", "b1", "b2", "c1", "c2", "c3")
		.filter(s ->s.startsWith("c"))
		.skip(1)
		.forEach(System.out::println); //중간연산후 모든 요소 출력
		
        /*출력값:
        		c2
         		c3			*/
	}

}

2.sum(), count(), average(), max(), min() - 집계에 대한 연산이다.

public class ScammEx {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        long count = Arrays.stream(arr).count();
        System.out.println(count);

        long sum = Arrays.stream(arr).sum();
        System.out.println(sum);

        double avg = Arrays.stream(arr).average().getAsDouble();
        System.out.println(avg);

        int max = Arrays.stream(arr).max().getAsInt();
        System.out.println(max);

        int min = Arrays.stream(arr).min().getAsInt();
        System.out.println(min);
    }
}

3.reduce() - 스트림의 모든 요소를 하나로 합치는 최종 연산(terminal operation)이다.

Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Optional<Integer> sum = numbers.reduce(Integer::sum);
sum.ifPresent(s -> System.out.println("sum: " + s));

4.collect() -요소들을 List, Set, Map 등 다른 종류의 결과로 수집할 때 사용한다.
collect() 메서드는 Collector 인터페이스를 구현한 클래스인 Collector 타입을 인자로 받는다.

import java.util.List;
import java.util.stream.Collectors;

public class CollectExample {
  public static void main(String[] args) {
      List<String> names = List.of("Alice", "Bob", "Charlie");

      // 스트림 → 리스트로 수집
      List<String> upperNames = names.stream()
                                     .map(String::toUpperCase)
                                     .collect(Collectors.toList());

      System.out.println(upperNames); // 출력: [ALICE, BOB, CHARLIE]
  }
}

0개의 댓글