반응형

중간 연산은 스트림 파이프라인에서 데이터를 변환하고 필터링하는 작업을 수행합니다.

중간 연산은 지연 연산(lazy evaluation)으로, 최종 연산이 호출될 때까지 실제로 수행되지 않습니다. 중간 연산은 항상 새로운 스트림을 반환합니다.

 

1. filter

설명: 주어진 조건에 맞는 요소만을 포함하는 스트림을 반환합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
Stream<String> filteredStream = items.stream().filter(item -> item.startsWith("A"));

2. map

설명: 각 요소를 주어진 함수에 의해 변환된 결과로 매핑하여 새로운 스트림을 반환합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
Stream<String> mappedStream = items.stream().map(String::toUpperCase);

3. flatMap

설명: 각 요소를 스트림으로 변환한 후, 하나의 스트림으로 평탄화하여 반환합니다.

예시:

List<List<String>> listOfLists = Arrays.asList(
    Arrays.asList("a", "b", "c"),
    Arrays.asList("d", "e", "f")
);
Stream<String> flatMappedStream = listOfLists.stream().flatMap(List::stream);

4. distinct

설명: 스트림의 중복 요소를 제거합니다.

예시:

List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
Stream<Integer> distinctStream = numbers.stream().distinct();

5. sorted

설명: 스트림의 요소를 정렬합니다.

예시:

List<String> items = Arrays.asList("Banana", "Apple", "Orange");
Stream<String> sortedStream = items.stream().sorted();

6. peek

설명: 각 요소를 소비하는 동안 추가 작업을 수행합니다. 주로 디버깅 목적으로 사용됩니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
Stream<String> peekedStream = items.stream().peek(System.out::println);

7. limit

설명: 스트림의 요소를 지정된 수만큼 제한합니다.

예시:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> limitedStream = numbers.stream().limit(3);

8. skip

설명: 스트림의 처음 N개의 요소를 건너뜁니다.

예시:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> skippedStream = numbers.stream().skip(2);

 

최종 연산 (Terminal Operations)

 

최종 연산은 스트림 파이프라인을 실행하고 결과를 생성합니다. 최종 연산은 스트림을 소비하며, 더 이상 다른 스트림 연산을 수행할 수 없습니다.

 

1. forEach

설명: 각 요소를 소비하여 주어진 작업을 수행합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
items.stream().forEach(System.out::println);

2. collect

설명: 스트림의 요소를 컬렉션이나 다른 유형의 결과로 수집합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
List<String> collectedList = items.stream().collect(Collectors.toList());

 

3. reduce

설명: 스트림의 요소를 결합하여 하나의 값으로 줄입니다.

예시:

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

 

4. count

설명: 스트림의 요소 개수를 반환합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
long count = items.stream().count();

 

5. anyMatch, allMatch, noneMatch

설명: 스트림의 요소가 주어진 조건에 대해 하나라도/모두/하나도 만족하지 않는지 확인합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
boolean anyMatch = items.stream().anyMatch(item -> item.startsWith("A"));
boolean allMatch = items.stream().allMatch(item -> item.length() > 3);
boolean noneMatch = items.stream().noneMatch(item -> item.startsWith("Z"));

6. findFirst, findAny

설명: 스트림의 첫 번째 요소를 찾거나, 임의의 요소를 찾습니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
Optional<String> firstItem = items.stream().findFirst();
Optional<String> anyItem = items.stream().findAny();

7. toArray

설명: 스트림의 요소를 배열로 반환합니다.

예시:

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
String[] itemArray = items.stream().toArray(String[]::new);

 

요약

 

중간 연산: 스트림을 변환하거나 필터링하는 연산으로, 지연 연산(lazy evaluation) 특성을 가집니다. (예: filter, map, distinct, sorted)

최종 연산: 스트림을 소비하여 결과를 생성하는 연산으로, 스트림 파이프라인을 실행합니다. (예: forEach, collect, reduce, count)

반응형
반응형

자바8의 스트림 API 특징

선언형: 더 간결하고 가독성이 좋아진다.
조립할수있음: 유연성이 좋아진다.
병렬화: 성능이 좋아진다.

스트림이란 '데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소'로 정의할 수 있다.
[딱 한번만 탐색할 수 있다]

스트림은 단 한번만 소비할 수 있다.

스트림 연산

java.util.stream.Stream 인터페이스는 많은 연산을 정의

filter, map, limit는 서로 연결되어 파이프라인을 형성한다. - 중간연산
collect로 파이프라인을 실행한 다음에 닫는다. - 최종연산

중간연산

filter나 sorted 같은 중간 연산은 다른 스트림을 반환
중간 연산의 중요한 특징은 단말 연산을 스트림 파이프라인에 실행하기 전까지는 아무 연산도 수행하지 않는다는 것이다.
즉 lazy하다는 것이다

최종연산

보통 최종 연산에 의해 List, Integer, void 등 스트림 이외의 결과가 반환.
forEach, count, collect처럼 스트림 파이프라인을 처리해서 스트림이 아닌 결과를 반환하는 연산을 최종 연산

반응형

+ Recent posts