본문 바로가기
Java

Stream

by 우 석 2024. 1. 12.

Stream은 Java 8부터 제공되는 자료구조와 프로그래밍 API입니다. 이는 자료구조를 한 번 더 추상화하여, 다양한 종류의 자료구조를 동일한 방식으로 다룰 수 있게 해 줍니다. 또한, 스트림은 병렬 처리에 유리한 구조이므로 성능도 향상할 수 있습니다.

 

특징

  • 원본의 데이터를 변경하지 않습니다. 즉, 스트림은 자바 컬렉션으로부터 받아와 사용하며, 원본 데이터는 그대로 유지됩니다.
  • 스트림은 일회용입니다. 한 번 사용한 스트림은 어디에도 남지 않고 소멸됩니다.

 

사용법

1. stream 받아오기

subjectScore.stream()


2. stream 가공. filter() 메서드를 사용하여 원하는 조건에 맞는 요소만을 걸러내는 등의 가공 작업을 수행할 수 있습니다. 

.filter((Score score) -> score.getSubject().equals("Java"))


3. stream 결과를 만듭니다. 가공한 스트림을 원하는 형태의 결과로 만들기 위해 toList()와 같은 메서드를 사용합니다.

.toList();

 

4. 예시

private static Map<String, Score> scoreStore = new HashMap<>();의 value 값의 회차 점수 가져오는 메서드

// Score들의 회차 정보를 바탕으로 Values에서 뽑아내는 메소드
public static List<Score> getScoreByIndex(Integer index) {
    return scoreStore.values().stream().filter(s -> s.getScoreIndex() == index).toList();
}

 

대표적인 API인 map(), forEach(), filter()

1. map()

stream의 각 요소에 대해 특정 연산을 수행하여 새로운 값을 반환하는 중간 연산입니다. 즉, 각 요소를 변환하여 새로운 스트림을 생성합니다. 이때, 원본 스트림과 크기가 같은 새로운 스트림이 반환됩니다. map()은 데이터를 변환하거나 필요한 정보를 추출하는데 유용합니다.


2. forEach()

forEach()는 stream의 각 요소를 반복하며 특정 작업을 수행하는 최종 연산입니다. forEach()는 반환값이 없으며, 주로 요소를 순회하면서 부수적인 작업을 수행할 때 사용됩니다. 예를 들어, 각 요소를 출력하거나 요소를 변경하는 등의 작업을 수행할 수 있습니다.


3. filter()

stream의 요소 중에서 특정 조건을 만족하는 요소만을 걸러내는 중간 연산입니다. 조건을 만족하는 요소만을 남긴 새로운 스트림을 반환합니다. filter()는 주어진 조건에 따라 요소를 필터링하는 데 사용되며, 조건을 만족하는 요소만을 선택적으로 처리할 수 있습니다.

 

정리 

코드의 가독성을 높이고, 병렬 처리를 통해 성능을 향상시키며, 메모리를 효율적으로 사용하는 등 다양한 장점을 가지고 있습니다. 따라서 데이터 처리 작업을 할 때 stream을 적극적으로 활용하면 유용합니다.

'Java' 카테고리의 다른 글

Map의 Value로 Class ? 𖦹 ˍ 𖦹  (0) 2024.01.11
Java 문자열 처리 이해: String vs. StringBuffer vs. StringBuilder  (0) 2024.01.10
상속 (Inheritance)  (0) 2024.01.09
접근 제어자 (Access Modifier), Getter, Setter  (0) 2024.01.08
List  (0) 2024.01.05