2020. 6. 28. 18:51ㆍ카테고리 없음
1. 개요
이 빠른 쓰기에서는 Java 9에서 새로 등장한 흥미로운 Stream API 개선에 중점을 둘 것입니다.
2. 스트림 테이크 워 / 드롭
이러한 방법에 대한 토론은 StackOverflow에서 반복적으로 나타납니다 (가장 인기있는 것은 이것입니다 ).
우리는 생성 할 것을 상상해 스트림 의 문자열 이전에 하나 개의 문자 추가하여의를 스트림 이의 현재 값의 길이까지의 값을 스트림 이하이다 (10) .
Java 8에서 어떻게 해결할 수 있습니까? 우리는 중 하나를 사용할 수있는 단락과 같은 중간 작업 제한 , allMatch 실제로 다른 목적을 위해 제공 또는 우리 자신 작성하는 것이 takeWhile의 구현 A의 기반 Spliterator를 차례로, 같은 간단한 문제를 복잡있다.
Java 9를 사용하면 솔루션이 쉽습니다.
Stream<String> stream = Stream.iterate("", s -> s + "s")
.takeWhile(s -> s.length() < 10);
takeWhile의 동작은 필요 술어 (a 스트림 정렬되는 경우)이 요소의 최장 프리픽스를 결정하는 요소로인가 또는 스트림의 구성 요소의 서브 세트 (스트림이 정렬되지 않은 경우).
앞으로 우리는“가장 긴 접두사”와“ 스트림의 하위 집합” 이 무엇을 의미하는지 더 잘 이해했습니다 .
- 가장 긴 접두사 는 주어진 술어와 일치하는 연속적인 스트림 요소 요소입니다. 시퀀스의 첫 번째 요소는이 스트림의 첫 번째 요소이며 시퀀스의 마지막 요소 바로 다음에 오는 요소는 주어진 술어와 일치하지 않습니다.
- 스트림의 부분 집합 의 일부 (전부는 아니지만) 요소의 집합입니다 스트림 주어진 조건을 일치합니다.
이러한 핵심 용어를 소개 한 후에는 다른 새로운 드롭 작업을 쉽게 이해할 수 있습니다 .
takeWhile 과 정반대입니다 . 스트림이 정렬되면 dropWile 은 주어진 술어와 일치하는 요소 의 가장 긴 접 두부 를 삭제 한 후이 Stream 의 나머지 요소로 구성된 스트림을 리턴합니다 .
그렇지 않으면, 스트림이 정렬되지는 dropWile은 이의 나머지 요소로 구성된 스트림 반환 스트림 일부 삭제 후 주어진 조건에 맞는 요소를.
앞서 얻은 Stream 을 사용하여 처음 다섯 가지 요소를 버리십시오 .
stream.dropWhile(s -> !s.contains("sssss"));
간단히 말해서 dropWhile 연산은 요소에 대해 주어진 술어가 true를 리턴 하고 첫 번째 술어의 false 에서 제거를 중지하는 동안 요소를 제거합니다 .
3. 스트림 반복
다음의 새로운 기능은 유한 스트림 생성을 위한 오버로드 된 반복 방법입니다 . 일부 함수에 의해 생성 된 무한 순차 스트림 을 반환하는 유한 변형 과 혼동하지 마십시오 .
새로운 반복 은 스트림에 종료해야하는 시점을 판별하기 위해 요소에 적용되는 술어를 추가하여이 메소드를 약간 수정합니다. 사용법은 매우 편리하고 간결합니다.
Stream.iterate(0, i -> i < 10, i -> i + 1)
.forEach(System.out::println);
해당하는 for 문과 연관 될 수 있습니다 .
for (int i = 0; i < 10; ++i) {
System.out.println(i);
}
4. Nullable 스트림
요소를 Stream 에 넣어야하는 상황이 있습니다 . 때때로이 요소는 null 일 수 있지만 Stream 에 이러한 값이 포함 되는 것을 원하지 않습니다 . 요소가 널 인지 여부를 확인 하는 if 문 또는 삼항 연산자를 작성합니다 .
콜렉션 및 맵 변수가 작성되고 채워 졌다고 가정하면 다음 예제를 살펴보십시오.
collection.stream()
.flatMap(s -> {
Integer temp = map.get(s);
return temp != null ? Stream.of(temp) : Stream.empty();
})
.collect(Collectors.toList());
이러한 상용구 코드를 피하기 위해 ofNullable 메소드가 Stream 클래스에 추가되었습니다 . 이 방법을 사용하면 위의 샘플을 간단히 다음과 같이 변환 할 수 있습니다.
collection.stream()
.flatMap(s -> Stream.ofNullable(map.get(s)))
.collect(Collectors.toList());
5. 결론
우리는 Java 9에서 Stream API의 주요 변경 사항과 이러한 개선 사항이 노력을 덜 사용하여보다 강조된 프로그램을 작성하는 데 어떻게 도움이 될지를 고려했습니다.