Java 9 스트림 수집기의 새로운 기능
Java 8에는 Map, List 및 Set과 같은 변경 가능한 컨테이너에 입력 요소를 축적하는 데 사용되는 수집기가 도입되었습니다. 이 기사에서는 주로 Collectors.groupingBy와 함께 스마트 요소 컬렉션을 제공하는 데 사용되는 Java 9의 두 가지 새로운 수집기인 Collectors.filtering 및 Collectors.FlatMapping을 살펴봅니다.
Collectors.filtering 메서드
Collectors.filtering 방법은 비슷합니다. Stream filter() 방법과 비교할 때 후자는 입력 요소를 필터링하는 데 사용되지만 사용 시나리오는 다릅니다. Stream filter()는 스트림 체인 방법에 사용되는 반면 Collectors.filtering 방법은 groupingBy와 함께 사용되도록 설계되었습니다.
Stream filter()는 먼저 요소를 필터링한 다음 그룹화합니다. 필터링된 값은 폐기되며 소급하여 추적할 수 없습니다. 먼저 그룹화한 다음 필터링해야 하는 항목을 추적해야 하는 경우 이것이 바로 Collectors.filtering이 수행할 수 있는 작업입니다.
Collectors.filtering은 함수 매개 변수를 사용하여 입력 매개 변수를 필터링한 다음 필터링된 요소를 수집합니다.
@Test public void givenList_whenSatifyPredicate_thenMapValueWithOccurences() { List<Integer> numbers = List.of(1, 2, 3, 5, 5); Map<Integer, Long> result = numbers.stream() .filter(val -> val > 3) .collect(Collectors.groupingBy(i -> i, Collectors.counting())); assertEquals(1, result.size()); result = numbers.stream() .collect(Collectors.groupingBy(i -> i, Collectors.filtering(val -> val > 3, Collectors.counting()))); assertEquals(4, result.size()); }
Collectors.FlatMapping 메서드
Collectors.flallMapping은 Collectors.mapping 메서드와 유사하지만 더 세부적입니다. 둘 다 요소를 수집하기 위해 함수와 수집기 매개 변수를 사용하지만 flatMapping 함수는 요소 스트림을 받은 다음 수집기를 통해 누적 작업을 수행합니다. 먼저 모델 클래스를 살펴보겠습니다.
class Blog { private String authorName; private List<String> comments = new ArrayList<>(); public Blog(String authorName, String ... comment){ this.authorName = authorName; comments.addAll(Arrays.asList(comment)); } public String getAuthorName(){ return this.authorName; } public List<String> getComments(){ return comments; } }
Collectors.platMapping 메서드는 중간 컬렉션을 건너뛰고 Collectors.groupingBy에서 정의한 단일 그룹 매핑 컨테이너에 직접 씁니다.
@Test public void givenListOfBlogs_whenAuthorName_thenMapAuthorWithComments() { Blog blog1 = new Blog("1", "Nice", "Very Nice"); Blog blog2 = new Blog("2", "Disappointing", "Ok", "Could be better"); List<Blog> blogs = List.of(blog1, blog2); Map<String, List<List<String>>> authorComments1 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.mapping(Blog::getComments, Collectors.toList()))); assertEquals(2, authorComments1.size()); assertEquals(2, authorComments1.get("1").get(0).size()); assertEquals(3, authorComments1.get("2").get(0).size()); Map<String, List<String>> authorComments2 = blogs.stream() .collect(Collectors.groupingBy(Blog::getAuthorName, Collectors.flatMapping(blog -> blog.getComments().stream(), Collectors.toList()))); assertEquals(2, authorComments2.size()); assertEquals(2, authorComments2.get("1").size()); assertEquals(3, authorComments2.get("2").size()); }
Collectors.mapping은 모든 그룹화(작성자의 설명) 값을 매핑합니다. List와 같은 컨테이너에 수집됩니다. 그리고 중간 컬렉션을 삭제하고 컬렉션을 수집기의 컨테이너에 직접 저장합니다.
위 내용은 Java9 스트림 수집기의 새로운 기능을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!