[Java] 스트림(Stream) 정복하기

JeongJun Min·2024년 11월 16일

JAVA

목록 보기
6/7
post-thumbnail

자바 8에서 함수형 인터페이스, 람다, 메서드 참조라는 개념이 추가되면서 배열과 컬렉션을 더 간결하고 효과적으로 처리할 수 있게 되었다.

스트림의 등장

기존에는 List, Set, Map같은 컬렉션 데이터를 처리하려면 반복문을 사용해야 했다. 이는 코드가 길어지고 가독성이 떨어지는 문제가 있었다.

스트림은 데이터를 반복하면서 변화느 필터링, 집계 등을 쉽게 수행할 수 있어 가독성도 좋고 자주 사용되는 메서드를 정의해 놓아 코드의 재사용성도 높아진다.

스트림의 특징

  • 데이터 처리 중심
    스트림은 데이터를 처리하기 위해 제공하며 데이터를 저장하지 않는다.
    스트림은 한 번 사용하면 재사용할 수 없다.
  • 선언형 방식
    메서드 선언을 통해 코드를 간결하게 작성할 수 있다.
  • 병렬 처리 지원
    병렬 스트림을 사용하여 멀티쓰레드 작업이 가능하다.
  • 지연 연산
    최종 연산까지 중간 연산은 수행하지 않는다.

스트림의 구성

스트림은 크게 스트림 생성, 스트림 가공(중간 연산), 스트림 결과 생성(최종 연산) 으로 나눌 수 있다.

스트림 생성

데이터 소스에서 스트림 객체를 생성한다.

  • List 스트림
List<String> list = List.of("Hi", "Hello", "Bye");
Stream<String> stream = list.stream();
  • 배열 스트림
String[] array = new String[]{"Hi", "Hello", "Bye"};
Stream<String> stream = Arrays.stream(array);
  • Stream.builder()
Stream<String> builderStream = Stream.<String>builder()
    .add("Hi").add("Hello").add("Bye")
    .build(); 

스트림 가공(중간 연산)

스트림을 변환하거나 필터링한다.

  • filter
    스트림 내의 요소를 필터링하여 조건에 맞는 요소만 통과시키는 과정
Stream<String> stream = names.filter(s -> s.startsWith("a"));
  • map
    스트림 내 요소를 특정 값으로 변환하는 과정
Stream<String> stream = list.stream()
	.map(String::toUpperCase); 
	// .map(String::length)
  • sorted
    스트림 내 요소를 정렬하는 작업
List<Integer> stream = list.stream()
    .sorted()
    // .sorted(Comparator.reverseOrder())
  • limit
    스트림 내 요소를 제한하여 n개만 반환
List<Integer> stream = list.stream()
   .limit(n)
  • peek
    스트림 내 요소를 확인 (중간 작업결과 확인)
  • distinct
    중복 제거
  • skip
    스트림 내 처음 n개 요소를 건너 뜀

스트림 결과 생성(최종 연산)

스트림의 데이터를 처리하고 결과를 반환하거나 특정 동작을 수행한다.

  • collect
    스트림의 요소를 컬렉션이나 다른 데이터 구조로 변환
List<String> stream = names.stream()
       .filter(name -> name.startsWith("A")                         
       .collect(Collectors.toList());
  • forEach
    스트림의 요소의 특정 작업을 수행
names.stream()
     .forEach(name -> System.out.println("Hello, " + name));
  • reduce
    스트림 내 요소를 하나의 집계로 누적
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
int sum = numbers.stream()
                 .reduce(0, Integer::sum);  // 15
  • count
    스트림 내 요소 개수를 반환
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
long count = numbers.stream()
                    .count();  // 5
  • toArray
    요소를 배열로 변환
  • anyMatch
    조건을 만족하는 요소가 하나라도 있는지 확인
  • allMatch
    모든 요소가 조건을 만족하는지 확인
  • noneMatch
    모든 요소가 조건을 만족하지 않는지 확인
  • findFirst
    첫 번째 요소 반환
  • findAny
    임의의 요소 반환
  • min
    최소값 반환
  • max
    최대값 반환

[Java] 스트림(Stream) 정리
[Java] 자바 스트림(Streams)의 개념과 사용 방법
[Java] Stream API -1 이해하기: 용어 및 Stream 생성

profile
개발계발

0개의 댓글