기존 스트림에 새로운 가치 추가
기존에 새로운 가치를 추가하는 좋은 방법이 Stream
있습니까? 내가 상상할 수있는 것은 다음과 같다.
public <T> Stream<T> addToStream(Stream<T> stream, T elem ) {
List<T> result = stream.collect(Collectors.toList());
result.add(elem);
return result.stream();
}
그러나 나는 장황함없이 람다 표현에서 사용할 수있는 더 간결한 것을 찾고 있습니다.
PECS 원칙 을 구현하려고 할 때 또 다른 질문이 나타났습니다 .
public <T> Stream<? super T> addToStream(Stream<? super T> stream, T elem ) {
List<? super T> result = stream.collect(Collectors.toList()); //error
result.add(elem);
return result.stream();
}
와일드 카드가 작동하지 않는 것 같고 Stream.collect
이유가 궁금합니다. 미리 감사드립니다.
문제는 잘못된 가정에 있습니다. 즉, 스트림에는 실제로 데이터가 포함되어 있습니다. 그들은하지 않습니다; 스트림은 데이터 구조가 아니며 다양한 데이터 소스에서 대량 작업을 지정하는 수단입니다.
두 개의 스트림을 하나로 결합하기위한 결합 자 (예 Stream.concat
:)와 알려진 요소 세트 ( Stream.of
) 또는 컬렉션 ( Collection.stream
) 에서 스트림을 생성하기위한 팩토리가 있습니다. 따라서 새로운 요소를 설명하는 새 스트림과 함께 손에 들고있는 스트림의 연결 인 새 스트림을 생성하려면 이들을 결합 할 수 있습니다.
PECS 예제의 문제점은 세 개의 발생이 ? super T
있고 동일한 유형을 설명한다고 가정하지만 그렇지 않다는 것입니다. 와일드 카드의 각 항목은 고유 한 캡처에 해당하며 원하는 것이 아닙니다. 컴파일러가 목록의 유형과 입력 스트림의 유형이 동일하다는 것을 알 수 있도록 해당 유형 변수에 이름을 지정해야합니다. (또한 컬렉션을 구체화하지 마십시오. 비용이 많이 들고 스트림이 유한하지 않으면 종료되지 않을 수 있습니다. concat을 사용하십시오.) 따라서 대답은 : 방금 제네릭이 잘못되었습니다. 한 가지 방법은 다음과 같습니다.
public<T> Stream<T> appendToStream(Stream<? extends T> stream, T element) {
return Stream.concat(stream, Stream.of(element));
}
실제로 스트림에서 소비하고있을 때 스트림에 "삽입"을 고려하고 있었기 때문에 PECS와 혼동했습니다.
어때
return Stream.concat(stream, Stream.of(elem));
이것은 원래 스트림이 유한하다고 가정합니다. 그렇지 않은 경우 역순으로 연결할 수 있습니다.
StreamEx의 라이브러리는 적절한 가지고 #prepend()
와 #append()
방법. 다음은 사용 방법의 예입니다.
StreamEx.of("second").prepend("first").append("third").forEach(System.out::println);
출력은 다음과 같습니다.
first
second
third
- 스트림을 목록으로 변환
- 새 항목 추가
- 다시 스트림으로 변환
가장 좋은 방법은 다음과 같이 flatMap을 사용하는 것입니다.
public <T> Stream<T> appendToStream(Stream<T> stream, T element) {
return stream.flatMap(e -> Stream.of(e, element));
}
이것은 원래 스트림에서 작동하므로 스트림에서 또 다른 중간 작업이 될 수 있습니다. 예 :
stream.flatMap(e -> Stream.of(e, element))
.map(...)
.filter(...)
.collect(Collectors.toList());
참고 URL : https://stackoverflow.com/questions/28785833/adding-new-value-to-existing-stream
'developer tip' 카테고리의 다른 글
문자열 또는 이진 데이터가 잘립니다. (0) | 2020.10.24 |
---|---|
Android 라이브러리 프로젝트 용 jar를 만드는 방법 (0) | 2020.10.24 |
find 출력을 캡처합니다. (0) | 2020.10.24 |
함수형 프로그래밍에서 응용 함수를 사용해야하는 이유는 무엇입니까? (0) | 2020.10.24 |
apk 파일의 코드를 추출하는 방법 (0) | 2020.10.24 |