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
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는 스트림을 생성하는 여러 가지 방법을 제공하므로 데이터 처리를 쉽게 시작할 수 있습니다.
스트림을 생성하는 가장 일반적인 방법은 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]
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());
각 요소에 대해 작업을 수행하며 종종 디버깅에 유용합니다.
List<String> names = List.of("Alice", "Bob"); List<Integer> nameLengths = names.stream() .map(String::length) .collect(Collectors.toList());
터미널 작업은 마지막에 실행되어 실제 데이터 처리가 시작되고 최종 결과가 반환됩니다.
스트림의 각 요소에 대해 작업을 실행합니다.
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);
주어진 조건과 일치하는 요소가 있는지, 전체인지, 아니면 전혀 없는지 확인합니다.
List<String> names = List.of("Alice", "Bob"); Set<String> nameSet = names.stream().collect(Collectors.toSet());
스트림의 첫 번째 요소 또는 모든 요소를 설명하는 Optional을 반환합니다.
List<String> names = List.of("Alice", "Bob"); long count = names.stream().count();
스트림과 람다 표현식은 함께 사용됩니다. 스트림은 기능적 인터페이스를 기반으로 하기 때문에 람다와 원활하게 작동하여 표현력이 뛰어나고 간결한 데이터 처리가 가능합니다.
예를 들어 이름 목록을 필터링하여 "A"로 시작하는 이름을 찾은 다음 대문자로 변환합니다.
List<String> names = List.of("Alice", "Bob", "Charlie"); boolean hasAlice = names.stream().anyMatch(name -> name.equals("Alice"));
이 예에서는:
Java Streams는 Java에 함수형 프로그래밍 기능을 제공하여 표현적이고 간결한 데이터 조작을 가능하게 합니다. 중간 작업과 터미널 작업의 차이점과 스트림을 효과적으로 생성하고 사용하는 방법을 이해함으로써 코드의 가독성과 유지 관리성을 크게 향상시킬 수 있습니다. 워크플로에 스트림과 람다를 통합하여 더욱 깔끔하고 효율적인 Java 애플리케이션을 작성하세요.
즐거운 스트리밍 되세요!
위 내용은 Java 스트림 마스터하기: 개발자를 위한 완벽한 가이드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!