SORU
16 NİSAN 2014, ÇARŞAMBA


Neden İterable<T> akışı sağlar() ve parallelStream() yöntemleri?

Iterable stream() parallelStream() yöntemleri sağlamaz neden merak ediyorum. Düşünün aşağıdaki sınıf:

public class Hand implements Iterable<Card> {
    private final List<Card> list = new ArrayList<>();
    private final int capacity;

    //...

    @Override
    public Iterator<Card> iterator() {
        return list.iterator();
    }
}

Bir uygulamasıdırElTicaret Kart Oyunu oynarken elindeki kartları fazla bir şey yok gibi.

Aslında List<Card> maksimum kapasite sağlayan ve başka yararlı özelliklere sahiptir sarar. Doğrudan List<Card> Bir uygulama olarak daha iyidir.

Şimdi, convienience için düşünseydim üzerinde döngü istiyorsanız Iterable<Card> gelişmiş kullanabileceğiniz gibi-döngüler uygulamak için iyi olurdu. (Hand Dersim de Iterable<Card> bence haklı get(int index) bir yöntem, dolayısıyla sağlar.)

Iterable arayüzü aşağıdaki (javadoc sol) sağlar:

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

Şimdi seninle bir akış elde edilebilir.:

Stream<Hand> stream = StreamSupport.stream(hand.spliterator(), false);

Gerçek soru üzerine:

  • Neden Iterable<T> stream() parallelStream(), uygulamak, bu imkansız ya da istenmeyen yapacak bir şey yok varsayılan bir yöntem sağlamaz?

Gerçi şudur buldum ile ilgili bir soru: Why does Stream<T> not implement Iterable<T>?
İşin garibi bu biraz tersi tavsiyeler vermek.

CEVAP
20 NİSAN 2014, Pazar


Bu bir ihmal değil; 2013 Haziran ayında EG listede ayrıntılı bir tartışma vardı.

Uzman Grubunun kesin tartışma this thread köklü.

Süre görünüyordu "açık" (hatta Uzman Grubu, başlangıçta) stream() fıstıklı anlamı Iterable aslında Iterable bu yüzden genel bir sorun haline geldi, çünkü bariz imza:

Stream<T> stream()

her zaman istediğiniz olacak değildi. Iterable<Integer> bazı şeyler akışı yöntemi dönüşleri IntStream örneğin bir tercih. Ama stream() yöntemi hiyerarşisinde bu kadar yükseğe koymak o kadar da imkansız bir hale getirecek. Bunun yerine, gerçekten kolay Stream Iterable vererek spliterator() bir yöntem sağlamak için yaptık. Collection 32 *uygulaması sadece:

default Stream<E> stream() {
    return StreamSupport.stream(spliterator(), false);
}

Herhangi bir istemci Iterable: bir yerden istedikleri yayını alabilir

Stream s = StreamSupport.stream(iter.spliterator(), false);

Sonunda Iterable 37 *ekleme bir hata olacağı sonucuna vardık.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • HowcastTechGadgets

    HowcastTechG

    22 EYLÜL 2010