IT/JAVA

Stream

iamhyeon 2025. 1. 3. 13:17

Stream

  • 스트림(Stream)은 Java 8에서 도입된 기능으로, 컬렉션(예: 리스트, 배열) 등의 데이터 소스를 처리하고 변환하는 데 사용된다.
  • 스트림은 데이터의 흐름을 추상화한 것으로, 데이터를 필터링, 매핑, 축소 등의 작업을 통해 처리할 수 있다.
  • 불변 데이터 흐름 : 데이터 소스를 변경하지 않고 처리한다.
  • 선언적: 스트림 API는 선언적 스타일을 사용하여 데이터 처리 작업을 표현한다. 이는 코드의 가독성을 높이고 유지보수를 쉽게 한다.
    • 더보기
      더보기
      명령형 스타일
      명령형 스타일은 데이터 처리 작업을 수행하는 방법을 단계별로 명시적으로 작성하는 방식이다.
      이는 반복문과 조건문을 사용하여 데이터를 처리하는 전통적인 방식이다. 

      int[] numbers = {1, 2, 3, 4, 5};
      int sum = 0;
      for (int number : numbers) {
          sum += number;
      }
      System.out.println("Sum: " + sum);
    • 더보기
      더보기
      선언적 스타일
      선언적 스타일은 데이터 처리 작업을 무엇을 수행할지에 대한 의도를 표현하는 방식이다.
      스트림 API는 선언적 스타일을 사용하여 데이터 처리 작업을 간결하게 표현할 수 있다.

      int[] numbers = {1, 2, 3, 4, 5};
      int sum = IntStream.of(numbers).sum();
      System.out.println("Sum: " + sum);
  • 함수형 프로그래밍: 스트림 API는 람다 표현식과 함수형 인터페이스를 사용하여 함수형 프로그래밍 스타일을 지원한다.
  • 지연 연산 (Lazy Evaluation) : 스트림의 중간 연산은 지연(lazy) 연산으로, 최종 연산이 호출될 때까지 실제로 수행되지 않는다. 이는 성능 최적화에 도움이 된다.
  • 병렬 처리: 스트림 API는 병렬 처리를 지원하여 멀티코어 프로세서를 활용한 성능 향상을 도모할 수 있다. (멀티스레드 사용)

import java.util.stream.Stream;

 

⬇️  스트림 자체를 출력하면 스트림 객체의 참조를 나타내는 문자열이 출력된다.

스트림의 요소를 출력하려면 스트림의 최종 연산을 사용해야 한다.

예를 들어, forEach 메서드를 사용하여 스트림의 각 요소를 출력할 수 있다.

public class Ex01_Stream {
    public static void main(String[] args) {
    	
        // 스트림 생성
        Stream<Integer> stream = Stream.of(1,2,3,4,5);        
        
        // 스트림 요소 출력
        // forEach는 스트림의 최종 연산
        // 스트림의 각 요소에 대해 람다표현식으로 출력한다.
        stream.forEach(System.out::println);
    }
}

 

더보기
더보기

메서드 참조 ::

'::'는 메서드 참조 연산자이다.

람다 표현식을 더 간결하게 작성할 수 있는 방법 중 하나이다

System.out::println 은 System.out.println 메서드를 참조하는 메서드 참조 표현식이다.


  1. Stream.of(values)
  2. Arrays.stream(array)  
  3. Arrays.asList(values).stream()
// 여러 값을 스트림으로 변환
Stream<Integer> stream = Stream.of(1,2,3,4,5);        
stream.forEach(System.out::println);

//  배열을 스트림으로 변환
Integer[] array = {1,2,3,4,5};
Stream<Integer> stream2 = Arrays.stream(array);
stream2.forEach(System.out::println);

// List, Set 등의 컬렉션에서 스트림 생성
List<Integer> list = Arrays.asList(1,2,3,4,5);
Stream<Integer> stream3 = list.stream();

 

Arrays.asList()  :  주어진 요소들을 포함하는 고정 크기의 리스트를 반환한다.

  • java.util.Arrays 클래스에 정의된 정적 메서드
  • 이 메서드는 가변 인수를 받아서, 주어진 요소들을 포함하는 고정 크기의 리스트를 반환한다
  • 반환된 리스트는 java.util.List 인터페이스를 구현한 java.util.Arrays$ArrayList 클래스의 인스턴스이다
  • List<Integer>는 제네릭 타입을 사용하여 Integer 타입의 요소를 가지는 리스트를 나타낸다
  • 제네릭 타입을 사용하면 컴파일 시 타입 안전성을 보장할 수 있다

주요 메서드


중간 연산 (결과로 새로운 스트림 반환)

  •  filter: 조건에 맞는 요소 필터링.
  •  map: 요소 변환.
  •  sorted: 정렬.
  •  distinct: 중복 제거.
  •  limit(n): 앞의 n개 요소만 처리.


최종 연산 (스트림을 소비하여 결과 생성)

  • collect: 스트림의 결과를 리스트, 세트 등으로 수집.
  • forEach: 각 요소에 작업 수행.
  • count: 요소 개수 반환.
  • reduce: 요소를 하나의 결과로 합침

filter

forEach

List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    // 5보다 큰 숫자만 필터링
    numbers.stream()
            .filter(x -> x>5)
            .forEach(System.out::println);
}

출력값


map

sorted

forEach

List<Integer> numbers2 = Arrays.asList(10,5,8,1,3);
// 2배로 변환 후 정렬
numbers2.stream()
        .map(x -> x*2)
        .sorted()
        .forEach(System.out::println);

출력값


filter

collect

/** 리스트 수집 */
List<Integer> numbers3 = Arrays.asList(1,2,3,4,5);
// 짝수만 리스트로 수집
List<Integer> evenNumbers = numbers3.stream()
                                    .filter(x -> x%2==0)
                                    .collect(Collectors.toList());
System.out.println(evenNumbers);

출력값

 

.collect(Collectors.toList())
- 스트림의 최종 연산으로, 스트림의 요소를 리스트로 수집한다.
- Collectors.toList()는 스트림의 요소를 리스트로 수집하는 컬렉터를 반환한다.
- 짝수만을 포함하는 리스트를 생성한다.


 

Stream은 컬렉션 기반 데이터 처리에 적합하다 !

 

 

 


refer to

메가아이티아카데미 이광호쌤

https://data04190.tistory.com/59

 

 

 

 

반응형

'IT > JAVA' 카테고리의 다른 글

StringBuilder  (0) 2025.01.19
IntStream  (0) 2025.01.04
Java 란  (3) 2024.12.27
MyBatis Log4j Error  (0) 2024.10.10
JDBC  (1) 2024.10.08