logo

Java에서 스트리밍

스트림이 도입되었습니다. 자바 8 Stream API는 개체 컬렉션을 처리하는 데 사용됩니다. Java의 스트림은 원하는 결과를 생성하기 위해 파이프라인할 수 있는 다양한 메서드를 지원하는 일련의 개체입니다. 

Java에서 스트림 사용

Java에서 Stream의 용도는 다음과 같습니다.

  • Stream API는 객체의 컬렉션을 표현하고 처리하는 방법입니다.
  • 필터링 매핑 축소 및 정렬과 같은 작업을 수행할 수 있습니다.

Java 스트림을 생성하는 방법

Java Stream Creation은 Java Stream의 기능을 고려하기 전 가장 기본적인 단계 중 하나입니다. 다음은 Java 스트림을 선언하기 위해 제공된 구문입니다.



배우 제나트 아만

통사론

개울개울;

여기서 T는 선언에 따라 클래스 객체이거나 데이터 유형입니다.

자바 스트림 기능

Java 스트림의 기능은 다음과 같습니다.

  • 스트림은 데이터 구조가 아닙니다. 단지 컬렉션 배열이나 I/O 채널에서 입력을 받습니다.
  • 스트림은 원본 데이터를 수정하지 않습니다. 그들은 그들의 방법을 사용해서만 결과를 생산합니다.
  • 중간 작업(예: 필터 맵 등)은 게으르고 다른 스트림을 반환하므로 함께 연결할 수 있습니다.
  • 터미널 작업(예: forEach 개수 수집)은 스트림을 종료하고 최종 결과를 제공합니다.

스트림의 다양한 작업

Streams에는 두 가지 유형의 작업이 있습니다.

  1. 중간 작업
  2. 터미널 운영

중간 작업

Java 스트림 작업' title=

중간 작업은 여러 메서드가 연속적으로 연결되는 작업 유형입니다.

중간작업의 특징

  • 메소드는 서로 연결되어 있습니다.
  • 중간 작업은 스트림을 다른 스트림으로 변환합니다.
  • 이는 한 방법으로 데이터를 필터링하고 처리 후 다른 방법으로 전달하는 필터링 개념을 가능하게 합니다.

중요한 중간 작업

아래에 언급된 몇 가지 중간 작업이 있습니다.

1. 지도() : map 메소드는 이 스트림의 요소에 주어진 함수를 적용한 결과로 구성된 스트림을 반환하는 데 사용됩니다.

통사론:

개울지도(기능매퍼)

2. 필터() : 필터 메소드는 인수로 전달된 조건자에 따라 요소를 선택하는 데 사용됩니다.

통사론:

개울필터(술어술부)

3. 정렬() : 정렬된 방법은 스트림을 정렬하는 데 사용됩니다.

통사론:

개울정렬()
개울정렬(비교기비교기)

4. 플랫맵(): Java Streams의 flatMap 작업은 컬렉션 스트림을 단일 요소 스트림으로 평면화하는 데 사용됩니다.

통사론:

개울flatMap(함수> 매퍼)

5. 구별() : 중복된 요소를 제거합니다. Object.equals(Object)에 따라 고유한 요소로 구성된 스트림을 반환합니다.

통사론:

개울별개의()

6. 엿보기() : 스트림을 수정하지 않고 각 요소에 대해 작업을 수행합니다. 결과 스트림에서 요소가 소비될 때 각 요소에 대해 제공된 작업을 추가로 수행하는 이 스트림의 요소로 구성된 스트림을 반환합니다.

통사론:

개울엿보기(소비자행동)

모든 중간 작업의 사용을 보여주는 Java 프로그램:

플로피 디스크
Java
import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class StreamIntermediateOperationsExample {  public static void main(String[] args) {  // List of lists of names  List<List<String>> listOfLists = Arrays.asList(  Arrays.asList('Reflection' 'Collection' 'Stream')  Arrays.asList('Structure' 'State' 'Flow')  Arrays.asList('Sorting' 'Mapping' 'Reduction' 'Stream')  );  // Create a set to hold intermediate results  Set<String> intermediateResults = new HashSet<>();  // Stream pipeline demonstrating various intermediate operations  List<String> result = listOfLists.stream()  .flatMap(List::stream)   .filter(s -> s.startsWith('S'))   .map(String::toUpperCase)   .distinct()   .sorted()   .peek(s -> intermediateResults.add(s))  .collect(Collectors.toList());   // Print the intermediate results  System.out.println('Intermediate Results:');  intermediateResults.forEach(System.out::println);  // Print the final result  System.out.println('Final Result:');  result.forEach(System.out::println);  } } 

산출
Intermediate Results: STRUCTURE STREAM STATE SORTING Final Result: SORTING STATE STREAM STRUCTURE 

설명:

  • listOfLists는 다른 문자열 목록을 포함하는 목록으로 생성됩니다.
  • flatMap(목록::스트림): 중첩된 목록을 단일 문자열 스트림으로 평면화합니다.
  • 필터(s -> s.startsWith('S')) : 'S'로 시작하는 문자열만 포함하도록 문자열을 필터링합니다.
  • 지도(문자열::toUpperCase) : 스트림의 각 문자열을 대문자로 변환합니다.
  • 별개의() : 중복된 문자열을 제거합니다.
  • 정렬() : 결과 문자열을 알파벳순으로 정렬합니다.
  • 몰래 엿보다(...): 중간 검사를 위해 설정된 IntermediateResults에 처리된 각 요소를 추가합니다.
  • 수집(Collectors.toList()): 최종 처리된 문자열을 결과라는 목록으로 수집합니다.

프로그램은 IntermediateResults 세트에 저장된 중간 결과를 인쇄합니다. 마지막으로 모든 스트림 작업 후에 완전히 처리된 문자열을 포함하는 결과 목록을 인쇄합니다.

터미널 운영

터미널 작업은 결과를 반환하는 작업 유형입니다. 이러한 작업은 더 이상 처리되지 않고 최종 결과 값을 반환합니다.

중요한 터미널 운영

1. 수집() : Collect 메소드는 스트림에서 수행된 중간 작업의 결과를 반환하는 데 사용됩니다.

통사론:

R 수집(수집기수집기)

2. 각각() : forEach 메서드는 스트림의 모든 요소를 ​​반복하는 데 사용됩니다.

통사론:

void forEach(소비자행동)

3. 감소(): Reduce 메소드는 스트림의 요소를 단일 값으로 줄이는 데 사용됩니다. 축소 메소드는 BinaryOperator를 매개변수로 사용합니다.

통사론:

T 감소(T 정체성 BinaryOperator누산기)
선택 과목감소(바이너리연산자누산기)

4. 카운트() : 스트림의 요소 수를 반환합니다.

통사론:

긴 카운트()

5. 먼저찾기() : 스트림의 첫 번째 요소가 있는 경우 이를 반환합니다.

통사론:

선택 과목첫 번째 찾기()

자바 루프

6. 모두 일치() : 스트림의 모든 요소가 주어진 조건자와 일치하는지 확인합니다.

통사론:

부울 allMatch(술어술부)

7. 애니매치 () : 스트림의 요소가 주어진 조건자와 일치하는지 확인합니다.

통사론:

부울 Anymatch(술어술부)

여기서 ans 변수에는 초기값으로 0이 할당되고 여기에 i가 추가됩니다.

메모: 중간 작업은 다음 메서드로 이동하기 전에 모든 메서드가 고정된 값(터미널 작업)을 반환하도록 보장하는 지연 평가(Lazy Evaluation) 개념을 기반으로 실행됩니다.

모든 터미널 작업을 사용하는 Java 프로그램:

Java
import java.util.*; import java.util.stream.Collectors; public class StreamTerminalOperationsExample {  public static void main(String[] args) {  // Sample data  List<String> names = Arrays.asList(  'Reflection' 'Collection' 'Stream'  'Structure' 'Sorting' 'State'  );  // forEach: Print each name  System.out.println('forEach:');  names.stream().forEach(System.out::println);  // collect: Collect names starting with 'S' into a list  List<String> sNames = names.stream()  .filter(name -> name.startsWith('S'))  .collect(Collectors.toList());  System.out.println('ncollect (names starting with 'S'):');  sNames.forEach(System.out::println);  // reduce: Concatenate all names into a single string  String concatenatedNames = names.stream().reduce(  ''  (partialString element) -> partialString + ' ' + element  );  System.out.println('nreduce (concatenated names):');  System.out.println(concatenatedNames.trim());  // count: Count the number of names  long count = names.stream().count();  System.out.println('ncount:');  System.out.println(count);  // findFirst: Find the first name  Optional<String> firstName = names.stream().findFirst();  System.out.println('nfindFirst:');  firstName.ifPresent(System.out::println);  // allMatch: Check if all names start with 'S'  boolean allStartWithS = names.stream().allMatch(  name -> name.startsWith('S')  );  System.out.println('nallMatch (all start with 'S'):');  System.out.println(allStartWithS);  // anyMatch: Check if any name starts with 'S'  boolean anyStartWithS = names.stream().anyMatch(  name -> name.startsWith('S')  );  System.out.println('nanyMatch (any start with 'S'):');  System.out.println(anyStartWithS);  } } 

산출:

스트림출력' loading='lazy' title=산출

설명:

  • 이름 목록은 샘플 문자열로 생성됩니다.
  • forEach: 목록의 각 이름을 인쇄합니다.
  • 모으다 : 'S'로 시작하는 이름을 필터링하여 새 목록으로 수집합니다.
  • 줄이다 : 모든 이름을 단일 문자열로 연결합니다.
  • 세다 : 총 이름 수를 계산합니다.
  • 첫 번째 찾기 : 목록에서 이름을 찾아서 인쇄합니다.
  • 모두 일치 : 모든 이름이 'S'로 시작하는지 확인합니다.
  • 불길한 : 'S'로 시작하는 이름이 있는지 확인합니다.

프로그램은 각 이름 'S'로 시작하는 이름이 연결된 이름 이름의 개수 모든 이름이 'S'로 시작하는지 여부와 'S'로 시작하는 이름이 있는지 여부를 인쇄합니다.

자바 스트림의 이점

아래에 언급된 것처럼 Java에서 Stream을 사용하면 몇 가지 이점이 있습니다.

  • 저장 공간 없음
  • 기능 파이프라인
  • 게으름
  • 무한할 수 있다
  • 병렬화 가능
  • Stream IntStream 등의 컬렉션 배열 파일 라인 메서드에서 생성될 수 있습니다.

Java 스트림의 실제 사용 사례

스트림은 다음과 같은 최신 Java 애플리케이션에서 널리 사용됩니다.

  • 데이터 처리
  • JSON/XML 응답 처리용
  • 데이터베이스 작업의 경우
  • 동시 처리