Stream 이 Itable을 구현 하지 않는 이유는 무엇입니까?
Java 8에서는 Stream< 클래스가 있습니다.T > 에는, 묘하게 방법이 있습니다.
Iterator<T> iterator()
따라서 인터페이스 Itable을 구현해야 합니다.<T > 에는, 이 방법이 필요합니다만, 실제로는 그렇지 않습니다.
Foreach 루프를 사용하여 스트림 상에서 반복하려면 다음과 같은 작업을 수행해야 합니다.
public static Iterable<T> getIterable(Stream<T> s) {
return new Iterable<T> {
@Override
public Iterator<T> iterator() {
return s.iterator();
}
};
}
for (T element : getIterable(s)) { ... }
내가 뭘 빠트렸나요?
이미 메일링 리스트 ☺에서도 같은 질문을 받았습니다.주된 이유는 Itable 또한 반복 가능한 의미론을 가지고 있지만 Stream은 그렇지 않기 때문이다.
가장 큰 이유는
Iterable
재사용 가능성을 내포하고 있는 반면,Stream
한 번만 사용할 수 있습니다.Iterator
.한다면
Stream
확장된Iterable
기존 코드가 수신했을 때 놀랄 수 있습니다.Iterable
퍽이나Exception
그들이 두 번째로 했을 때for (element : iterable)
.
변환하려면Stream
에 대해서Iterable
,할수있습니다
Stream<X> stream = null;
Iterable<X> iterable = stream::iterator
합격하다Stream
기대하는 방법으로Iterable
,
void foo(Iterable<X> iterable)
단순히
foo(stream::iterator)
하지만 그것은 아마 좀 웃기는데, 좀 더 명백히 하는 것이 나을 듯 보인다.
foo( (Iterable<X>)stream::iterator );
나는 StreamEx을 구현하는가를 지적하고 싶습니다.Iterable
(그리고Stream
), as well as a host of other immensely awesome functionality missing fromStream
.
스트림을 사용할 수 있습니다.for
다음과 같이 루프를 실행합니다.
Stream<T> stream = ...;
for (T x : (Iterable<T>) stream::iterator) {
...
}
(여기 이 무리 없이 뛰어)
(이것은 자바 8기능성 인터페이스는 썼다.).
(이는 일부 의견들은 위의(예를 들어 알렉산드르 뒤 덮여 있),지만 나는 답에 더 보이게 하는 그것을 빼기.)를 원했다.
왜 a을 치료하는 거 Kennytm을 묘사했다.Stream
로서Iterable
, 그리고 중 유 씨는 a를 사용하여 허가해 해결 방법을 제공했다Stream
에서와 같이Iterable
위험하긴 하지만요두 가지 장점을 모두 활용할 수 있습니다. 재사용 가능Iterable
에서Stream
모든 보증을 충족시키는 것Iterable
사양.
주의:SomeType
여기서 는 타입 파라미터가 아닙니다.적절한 타입으로 치환해야 합니다(예:String
) 또는 반사에 의존합니다.
Stream<SomeType> stream = ...;
Iterable<SomeType> iterable = stream.collect(toList()):
주요 단점은 다음과 같습니다.
게으른 반복의 혜택은 사라질 것이다.현재 스레드의 모든 값에 대해 즉시 반복할 계획인 경우 오버헤드는 무시해도 됩니다.그러나 일부만 반복하거나 다른 스레드에서 반복할 계획인 경우 이 즉각적이고 완전한 반복이 의도하지 않은 결과를 초래할 수 있습니다.
물론 가장 큰 장점은 이 시스템을Iterable
에 , ,는.(Iterable<SomeType>) stream::iterator
1월 1일수신 코드가 컬렉션에 걸쳐 여러 번 반복될 경우 이는 필요할 뿐만 아니라 성능에 도움이 될 수 있습니다.
Stream
does does does does 。Iterable
. . . .standing . . .에 대한 Iterable
몇 번이고 반복할 수 있는 모든 것을 말합니다. Stream
재생할 수 없을 수 있습니다.
스트림을 기반으로 반복할 수 있는 유일한 회피책은 스트림을 재생하는 것입니다.는 ★★★★★★★★★★★★★★★★★★★★★를 사용하고 있습니다.Supplier
새 반복기를 생성할 때마다 스트림의 새 인스턴스를 만듭니다.
Supplier<Stream<Integer>> streamSupplier = () -> Stream.of(10);
Iterable<Integer> iterable = () -> streamSupplier.get().iterator();
for(int i : iterable) {
System.out.println(i);
}
// Can iterate again
for(int i : iterable) {
System.out.println(i);
}
서드파티 라이브러리를 사용해도 괜찮다면 cyclops-react는 Stream과 Itable을 모두 구현하고 재생 가능한 Stream을 정의합니다(kennytm에서 설명한 문제 해결).
Stream<String> stream = ReactiveSeq.of("hello","world")
.map(s->"prefix-"+s);
또는 :-
Iterable<String> stream = ReactiveSeq.of("hello","world")
.map(s->"prefix-"+s);
stream.forEach(System.out::println);
stream.forEach(System.out::println);
[공개 사이클롭스 리액트 개발 책임자입니다]
완벽하지는 않지만 작동 가능:
iterable = stream.collect(Collectors.toList());
하지 않습니다.List
않다Iterable
★★★★★★★★★★★★★★★★★」Stream
거의 다 됐어그들은 게을러야 한다.
할 수 .Stream<Path>
음음음같 뭇매하다
Path path = Paths.get("...");
Stream<Path> files = Files.list(path);
for (Iterator<Path> it = files.iterator(); it.hasNext(); )
{
Object file = it.next();
// ...
}
언급URL : https://stackoverflow.com/questions/20129762/why-does-streamt-not-implement-iterablet
'programing' 카테고리의 다른 글
C에서 정수를 문자로 변환하는 방법 (0) | 2022.07.19 |
---|---|
JSP 2를 사용하여 JSP 파일의 Java 코드를 회피하려면 어떻게 해야 합니까? (0) | 2022.07.19 |
Vuetify.js: 왼쪽과 오른쪽의 v-card에 버튼 액션을 배치하는 방법 (0) | 2022.07.19 |
비반응 데이터를 Vuex에 저장하는 방법 (0) | 2022.07.19 |
타입 스크립트를 사용한vue-composition-api 유닛 테스트, 내부 셋업 기능 및 래퍼 내부 데이터를 얻는 방법 (0) | 2022.07.19 |