programing

Stream이 Itable을 구현하지 않는 이유는 무엇입니까?

sourcetip 2022. 7. 19. 23:23
반응형

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::iterator1월 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

반응형