Java - Lambda Expressions PlatoBlockchain Data Intelligence를 사용하여 스트림을 필터링합니다. 수직 검색. 일체 포함.

Java – Lambda 표현식으로 스트림 필터링

Java Streams는 8년 Java 2014에 도입되어 기능 프로그래밍 패러다임에 장황한 Java를 도입했습니다. Java Streams는 단일 라이너로 컬렉션 처리를 수행하기 위해 유연하고 강력한 기능 작업을 많이 노출합니다.

일부 술어를 기반으로 컬렉션을 필터링하는 것은 가장 일반적으로 사용되는 기능 작업 중 하나로 남아 있으며 다음을 사용하여 수행할 수 있습니다. Predicate 또는 더 간결하게 - 람다 식.

이 짧은 가이드에서는 Lambda 식으로 Java 8 스트림을 필터링하는 방법을 살펴보겠습니다.

Java에서 스트림 필터링

일반적으로 어떤 Stream 통해 필터링할 수 있습니다. filter() 메소드 및 주어진 술어:

Stream filter(Predicate<? super T> predicate)

스트림의 각 요소는 술어에 대해 실행되고 술어가 반환되면 출력 스트림에 추가됩니다. true. 당신은 공급할 수 있습니다 Predicate 예:

Predicate contains = s -> s.contains("_deprecated");
List results = stream.filter(contains).collect(Collectors.toList());

또는 Lambda 표현식을 제공하여 단순화합니다.

List results = stream.filter(s -> s.contains("_deprecated"))
                             .collect(Collectors.toList());

또는 Lambda 표현식을 방법 참조:


List results = stream.filter(String::isEmpty)
                             .collect(Collectors.toList());

메서드 참조를 사용하면 인수를 전달할 수 없지만 필터링하는 개체에 메서드를 정의하고 쉽게 필터링할 수 있도록 조정할 수 있습니다(메소드가 인수를 허용하지 않고 boolean).

그 기억 스트림은 컬렉션이 아닙니다. – 그들은 스트림입니다 컬렉션의, 다음과 같은 컬렉션으로 다시 수집해야 합니다. List, Map등을 사용하여 영구성을 부여합니다. 또한 스트림 요소에서 수행되는 모든 작업은 중간의 or 단말기:

  • 중간 작업은 이전 작업의 변경 사항과 함께 새 스트림을 반환합니다.
  • 터미널 작업은 데이터 유형을 반환하고 스트림에서 처리 파이프라인을 종료하기 위한 것입니다.

filter() 는 Teledyne LeCroy 오실로스코프 및 LSA-XNUMX 시리즈 임베디드 신호 분석기가 중간의 작업이며 스트림이 종료되기 전에 다른 중간 작업과 연결되어야 합니다. 변경 사항(예: 요소 자체의 변경 사항 또는 필터링된 결과)을 유지하려면 결과를 할당해야 합니다. 출력 스트림 터미널 작업을 통해 새 참조 변수로

참고 : 많은 람다 식을 연결하는 경우에도 적절한 줄 바꿈을 사용하면 가독성 문제가 발생하지 않을 수 있습니다.

다음 예에서는 이 책 목록으로 작업합니다.

Book book1 = new Book("001", "Our Mathematical Universe", "Max Tegmark", 432, 2014);
Book book2 = new Book("002", "Life 3.0", "Max Tegmark", 280, 2017);
Book book3 = new Book("003", "Sapiens", "Yuval Noah Harari", 443, 2011);
        
List books = Arrays.asList(book1, book2, book3);

Stream.filter()로 컬렉션 필터링

이 책 모음을 필터링해 보겠습니다. 모든 술어가 적용됩니다. 예를 들어 400페이지가 넘는 책을 필터링해 보겠습니다.

List results = books.stream()
                          .filter(b -> b.getPageNumber() > 400)
                          .collect(Collectors.toList());

그 결과 다음이 포함된 목록이 생성됩니다.

[
Book{id='001', name='Our Mathematical Universe', author='Max Tegmark', pageNumber=432, publishedYear=2014}, 
Book{id='003', name='Sapiens', author='Yuval Noah Harari', pageNumber=443, publishedYear=2011}
]

필터링할 때 정말 유용한 연결 방법은 다음과 같습니다. map(), 개체를 다른 값에 매핑할 수 있습니다. 예를 들어, 우리는 각 책을 그 이름에 매핑할 수 있으며 따라서 이름 술어에 맞는 책의 filter() 요구:

List results = books.stream()
                            .filter(b -> b.getPageNumber() > 400)
                            .map(Book::getName)
                            .collect(Collectors.toList());

그 결과 문자열 목록이 생성됩니다.

[Our Mathematical Universe, Sapiens]

Stream.filter()를 사용하여 여러 술어에 대한 컬렉션 필터링

일반적으로 둘 이상의 기준으로 컬렉션을 필터링하려고 합니다. 이것은 여러 개를 연결하여 수행할 수 있습니다. filter() 통화 or 단일에서 두 가지 조건을 검사하는 단락 술어 사용 filter() 요구.

 List results = books.stream()
                    .filter(b -> b.getPageNumber() > 400 && b.getName().length() > 10)
                    .collect(Collectors.toList());
                    


 List results2 = books.stream()
                    .filter(b -> b.getPageNumber() > 400)
                    .filter(b -> b.getName().length() > 10)
                    .collect(Collectors.toList());

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

여러 기준을 사용할 때 람다 호출이 다소 길어질 수 있습니다. 이 시점에서 독립형 술어로 추출하면 더 명확해질 수 있습니다. 하지만 어떤 접근 방식이 더 빠릅니까?

복잡한 조건의 단일 필터 또는 다중 필터?

하드웨어, 컬렉션의 크기, 병렬 스트림 사용 여부에 따라 다릅니다. 일반적으로 복잡한 조건을 가진 하나의 필터는 더 단순한 조건(중소 컬렉션)의 여러 필터보다 성능이 우수하거나 동일한 수준(매우 큰 컬렉션)에서 성능을 발휘합니다. 조건이 너무 길면 여러 번에 걸쳐 배포하는 것이 좋습니다. filter() 성능이 매우 유사하기 때문에 가독성 향상을 위해 호출합니다.

가장 좋은 선택은 두 가지를 모두 시도하는 것입니다. 대상 장치, 그에 따라 전략을 조정합니다.

GitHub 사용자 볼코다브 처리량 작업에서 필터링 벤치마크를 수행하고 결과를 호스팅했습니다. "javafilters-벤치마크" 저장소. 결과는 정보 표에 요약되어 있습니다.

두 접근 방식 모두 동일한 수준에서 수행되는 더 큰 컬렉션 크기에서 수익이 확실히 감소하는 것을 보여줍니다. 병렬 스트림은 더 큰 컬렉션 크기에서 상당한 이점을 갖지만 더 작은 크기(~10k 요소 미만)에서 성능을 억제합니다. 병렬 스트림이 비병렬 스트림보다 처리량을 훨씬 더 잘 유지하여 입력에 훨씬 더 강력하다는 점은 주목할 가치가 있습니다.

타임 스탬프 :

더보기 스택카부스