[Java] 스트림 (Stream) 사용해 보기

eunsil·2024년 5월 11일
0

Java

목록 보기
4/6
post-thumbnail

스트림 (Stream) 이란?

Java8 부터 도입된 기능으로, 람다를 활용해 컬렉션을 다루는 함수형 프로그래밍이다.
스트림은 데이터의 흐름을 말하고, 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해 원하는 결과를 필터링해 가공된 결과를 얻을 수 있다.


특징

  1. 코드의 간결성
  2. 병렬 처리 가능 : 대규모 데이터 셋의 성능 향상
  3. 지연 평가 : 실제로 필요할 때까지 작업이 실행되지 않아 성능 향상과 메모리 사용량 감소
  4. 함수 구성 : 작업을 함수 방식으로 결합해 간단한 처리 파이프라인 작성

스트림 사용법

스트림 생성

배열

String[] array = { "apple", "banana", "orange" };
Stream<String> stream = Arrays.stream(array);

컬렉션

Arrays.asList() 를 사용해 배열로 변환 후 생성한다.

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();

빌더 패턴

Stream.Builder<Integer> builder = Stream.builder();
builder.add(1);
builder.add(2);
builder.add(3);

Stream<Integer> stream = builder.build();
stream.forEach(System.out::println);

중간 연산 (데이터 가공)

filtering

조건에 맞는 요소만 필터링

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
		.filter(n -> n % 2 == 0)
        .collect(Collectors.toList());

System.out.println(evenNumbers); // [2, 4]

mapping

컬렉션의 요소를 다른 값으로 변환해 매핑

List<String> names = Arrays.asList("Daniel", "George", "Paul");
List<Integer> nameLengths = names.stream()
		.map(String::length)
		.collect(Collectors.toList());

System.out.println(nameLengths); // [6, 6, 4]

sorting

컬렉션의 요소를 정렬

List<Integer> numbers = Arrays.asList(3, 7, 0, 2, 5);
List<Integer> sortedNumbers = numbers.stream()
        .sorted()
        .collect(Collectors.toList());

System.out.println(sortedNumbers); // [0, 2, 3, 5, 7]

limiting

컬렉션의 최대 요소 개수를 제한

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> limitedNumbers = numbers.stream()
        .limit(3)
        .collect(Collectors.toList());

System.out.println(limitedNumbers); // [1, 2, 3]

skipping

몇 개의 요소를 건너뛸지 지정

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> skippedNumbers = numbers.stream()
        .skip(2)
        .collect(Collectors.toList());

System.out.println(skippedNumbers); // [3, 4, 5]

reducing

컬렉션의 모든 요소를 하나의 값으로 결합

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
        .reduce(0, Integer::sum);

System.out.println(sum); // 15

collecting

컬렉션의 요소를 원하는 형태의 요소로 수집

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Set<Integer> numberSet = numbers.stream()
        .collect(Collectors.toSet());

System.out.println(numberSet); // [1, 2, 3, 4, 5]

grouping

컬렉션의 요소를 원하는 기준으로 그룹핑

List<String> names = Arrays.asList("Daniel", "George", "Paul");
Map<Character, List<String>> namesByFirstLetter = names.stream()
        .collect(Collectors. groupingBy(name -> name.charAt(0)));

System.out.println(namesByFirstLetter); // {P=[Paul], D=[Daniel], G=[George]}

parallel processing

병렬 처리를 지원해 대용량 데이터 처리 가능

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
        .reduce(0, Integer::sum);

System.out.println(sum); // 15

최종 연산 (결과 도출)

forEach

스트림의 각 요소에 대해 동작을 수행하고, 주로 출력 시 사용한다.

List<String> strings = Arrays.asList("apple", "banana", "cherry");
strings.stream().forEach(System.out::println);

count

스트림에 포함된 요소의 개수 반환한다.

long count = strings.stream().count();

collect

스트림의 요소를 수집해 최종 결과 반환한다.
(중간 연산의 filtering 예제 참고)

.collect(Collectors.toList())

자주 사용되는 수집기: toList(), toSet(), toMap()


reduce

스트림 요소를 결합해 단일 값으로 줄인다.
모든 요소를 하나로 합치거나, 최댓값 또는 최솟값을 도출하는 작업에 사용된다.

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = numbers.stream().reduce((a, b) -> a + b);

reference

Java stream 간단한 사용법 정리 - 고승조님의 블로그 - 인프런
[JAVA] Stream에 대한 사용법 및 내용 정리

0개의 댓글