> Java > java지도 시간 > Java 스트림 마스터하기: 개발자를 위한 완벽한 가이드

Java 스트림 마스터하기: 개발자를 위한 완벽한 가이드

Linda Hamilton
풀어 주다: 2024-11-27 19:53:10
원래의
898명이 탐색했습니다.

Mastering Java Streams: A Complete Guide for Developers

Java 8에 도입된 Java Streams는 Java 8에 추가된 가장 강력한 기능 중 하나입니다. 컬렉션과 시퀀스에 대한 기능적 스타일 작업을 가능하게 하여 Java에서 데이터 처리에 접근하는 방식을 변화시킵니다. 스트림은 데이터 필터링, 매핑, 수집과 같은 작업을 단순화하는 동시에 성능 향상을 위한 병렬 작업도 지원합니다. 이 게시물에서는 Streams의 기본 사항을 살펴보고 Streams가 지원하는 작업 유형에 대해 논의하며 이 필수 기능을 최대한 활용하는 데 도움이 되는 예제를 제공합니다.

목차

1.  What is Streams and why we need it?
2.  Types of Streams: Intermediate vs. Terminal
3.  Creating Streams in Java
4.  Intermediate Stream Operations
5.  Terminal Stream Operations
6.  Using Streams with Lambdas
7.  Conclusion
로그인 후 복사
로그인 후 복사

Streams란 무엇이며 왜 필요한가요?

Java의 스트림은 데이터 수집을 처리하는 강력한 방법을 제공합니다. 이를 통해 기본 데이터를 변경하지 않고도 필터링 및 변환과 같은 컬렉션 요소에 대한 기능적 작업을 수행할 수 있습니다. 스트림은 데이터 처리를 위한 더 높은 수준의 추상화를 제공하여 개발자가 달성 방법보다는 달성하려는 목표에 집중할 수 있도록 도와줍니다.

스트림은 Java의 표현력을 높이고 상용구 코드를 줄이기 위해 설계된 람다 표현식 및 기능적 인터페이스와 함께 Java 8에 도입되었습니다. 스트림을 통합함으로써 Java는 함수형 프로그래밍 패러다임을 수용하기 시작하여 더욱 깔끔하고 간결한 코드를 가능하게 했습니다.

스트림의 주요 이점

  • 선언적 데이터 처리: 루프와 조건을 수동으로 관리하는 대신 수행하려는 작업을 설명하세요.
  • 불변성 및 상태 비저장: 스트림 작업은 소스 데이터 구조를 수정하지 않습니다.
  • 병렬 처리: 병렬 스트림을 지원하여 작업을 여러 스레드에 쉽게 분산시킬 수 있습니다.

스트림 유형: 중간 및 터미널

스트림은 두 가지 주요 유형으로 분류됩니다.

  • 중간 작업: 이 작업은 스트림을 변환하여 결과적으로 다른 스트림을 반환합니다. 게으르다. 즉, 터미널 작업이 호출될 때까지 실행되지 않습니다.
  • 터미널 작업: 이러한 작업은 스트림의 데이터 처리를 트리거하고 스트림이 아닌 결과(예: 컬렉션, 단일 값 또는 부울)를 반환합니다. 터미널 작업이 실행되면 스트림은 소비된 것으로 간주되어 재사용할 수 없습니다.

예:

List<String> names = List.of("Alice", "Bob", "Charlie", "David");

// Intermediate (lazy) operations: filter and map
Stream<String> stream = names.stream()
                             .filter(name -> name.startsWith("A"))
                             .map(String::toUpperCase);

// Terminal operation: collect
List<String> filteredNames = stream.collect(Collectors.toList());
System.out.println(filteredNames); // Output: [ALICE]
로그인 후 복사
로그인 후 복사

이 예에서 필터와 맵은 터미널 작업 Collect가 호출될 때까지 실행되지 않는 중간 작업입니다.

Java로 스트림 생성

Java는 스트림을 생성하는 여러 가지 방법을 제공하므로 데이터 처리를 쉽게 시작할 수 있습니다.

  • 컬렉션에서

스트림을 생성하는 가장 일반적인 방법은 List, Set, Map과 같은 컬렉션을 사용하는 것입니다.

1.  What is Streams and why we need it?
2.  Types of Streams: Intermediate vs. Terminal
3.  Creating Streams in Java
4.  Intermediate Stream Operations
5.  Terminal Stream Operations
6.  Using Streams with Lambdas
7.  Conclusion
로그인 후 복사
로그인 후 복사
  • 배열에서
List<String> names = List.of("Alice", "Bob", "Charlie", "David");

// Intermediate (lazy) operations: filter and map
Stream<String> stream = names.stream()
                             .filter(name -> name.startsWith("A"))
                             .map(String::toUpperCase);

// Terminal operation: collect
List<String> filteredNames = stream.collect(Collectors.toList());
System.out.println(filteredNames); // Output: [ALICE]
로그인 후 복사
로그인 후 복사
  • Stream.of 사용
List<String> names = List.of("Alice", "Bob", "Charlie");
Stream<String> nameStream = names.stream();
로그인 후 복사
  • 무한 스트림(생성 스트림)

Java에서는 Stream.generate 및 Stream.iterate를 사용하여 무한 스트림을 생성할 수 있습니다.

String[] namesArray = {"Alice", "Bob", "Charlie"};
Stream<String> nameStream = Arrays.stream(namesArray);
로그인 후 복사

중간 스트림 작업

중간 작업은 새 스트림을 반환하며 지연됩니다. 이는 터미널 작업이 호출될 때만 실행된다는 의미입니다.

  • 필터(술어)

조건에 따라 요소를 필터링합니다.

Stream<String> stream = Stream.of("Alice", "Bob", "Charlie");
로그인 후 복사
  • 맵(함수)

요소를 한 유형에서 다른 유형으로 변환합니다.

Stream<Double> randomNumbers = Stream.generate(Math::random).limit(5);
Stream<Integer> counting = Stream.iterate(0, n -> n + 1).limit(5);
로그인 후 복사
  • 정렬(비교기)

자연 순서 또는 비교기를 기준으로 요소를 정렬합니다.

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
                                   .filter(n -> n % 2 == 0)
                                   .collect(Collectors.toList());
로그인 후 복사
  • 피크(Consumer)

각 요소에 대해 작업을 수행하며 종종 디버깅에 유용합니다.

List<String> names = List.of("Alice", "Bob");
List<Integer> nameLengths = names.stream()
                                 .map(String::length)
                                 .collect(Collectors.toList());
로그인 후 복사

터미널 스트림 작업

터미널 작업은 마지막에 실행되어 실제 데이터 처리가 시작되고 최종 결과가 반환됩니다.

  • forEach(소비자)

스트림의 각 요소에 대해 작업을 실행합니다.

List<String> names = List.of("Bob", "Alice", "Charlie");
List<String> sortedNames = names.stream()
                                .sorted()
                                .collect(Collectors.toList());
로그인 후 복사
  • 수집(수집가)

스트림의 요소를 컬렉션, 목록, 세트 또는 기타 데이터 구조로 수집합니다.

List<String> names = List.of("Alice", "Bob");
names.stream()
     .peek(name -> System.out.println("Processing " + name))
     .collect(Collectors.toList());
로그인 후 복사
  • 카운트()

스트림의 요소 수를 계산합니다.

List<String> names = List.of("Alice", "Bob");
names.stream().forEach(System.out::println);
로그인 후 복사
  • anyMatch(Predicate), allMatch(Predicate), noneMatch(Predicate)

주어진 조건과 일치하는 요소가 있는지, 전체인지, 아니면 전혀 없는지 확인합니다.

List<String> names = List.of("Alice", "Bob");
Set<String> nameSet = names.stream().collect(Collectors.toSet());
로그인 후 복사
  • findFirst() 및 findAny()

스트림의 첫 번째 요소 또는 모든 요소를 ​​설명하는 Optional을 반환합니다.

List<String> names = List.of("Alice", "Bob");
long count = names.stream().count();
로그인 후 복사

Lambda와 함께 스트림 사용

스트림과 람다 표현식은 함께 사용됩니다. 스트림은 기능적 인터페이스를 기반으로 하기 때문에 람다와 원활하게 작동하여 표현력이 뛰어나고 간결한 데이터 처리가 가능합니다.

예를 들어 이름 목록을 필터링하여 "A"로 시작하는 이름을 찾은 다음 대문자로 변환합니다.

List<String> names = List.of("Alice", "Bob", "Charlie");
boolean hasAlice = names.stream().anyMatch(name -> name.equals("Alice"));
로그인 후 복사

이 예에서는:

  • 필터는 람다 이름을 사용합니다 -> name.startsWith("A") - 이름을 필터링합니다.
  • map은 메소드 참조 String::toUpperCase를 사용하여 이름을 대문자로 변환합니다.

결론

Java Streams는 Java에 함수형 프로그래밍 기능을 제공하여 표현적이고 간결한 데이터 조작을 가능하게 합니다. 중간 작업과 터미널 작업의 차이점과 스트림을 효과적으로 생성하고 사용하는 방법을 이해함으로써 코드의 가독성과 유지 관리성을 크게 향상시킬 수 있습니다. 워크플로에 스트림과 람다를 통합하여 더욱 깔끔하고 효율적인 Java 애플리케이션을 작성하세요.

즐거운 스트리밍 되세요!

위 내용은 Java 스트림 마스터하기: 개발자를 위한 완벽한 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿