SORU
29 Mart 2014, CUMARTESİ


Java 8'In Akışı ile İsteğe bağlı kullanarak::flatMap

8 stream yeni bir Java çerçeve ve arkadaşlar çok kısa ve öz bazı java kodu için yapmak, ama kısaca yapmak zor gibi görünen basit bir durumla karşılaştım.

List<Thing> things ve bir yöntem Optional<Other> resolve(Thing thing) düşünün. Optional<Other>s Things göster ve ilk Other almak istiyorum. Kesin çözüm olacağını kullanın things.stream().flatMap(this::resolve).findFirst() ama flatMap gerektiren geri akışı ve Optional yok stream() yöntem (yoksa Collection sağlayacak bir yöntem dönüştürmek için ya da görünüm olarak Collection).

Bulabildiğim en iyisi bu

things.stream()
    .map(this::resolve)
    .filter(Optional::isPresent)
    .map(Optional::get)
    .findFirst();

Ama bu çok uzun soluklu çok yaygın bir durum gibi görünüyor. Daha iyi bir fikrin var mı?

CEVAP
29 Mart 2014, CUMARTESİ


Evet, bu biraz uygunsuz sıfır ya da bir uzunluk bir Akış halinde İsteğe bağlı açmak için şu API küçük bir delik olarak görünüyor. Bunu yapmak için:

Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
          .findFirst();

Bu flatMap içinde üçlü operatör olması daha iyi bunu yapmak için küçük bir yardımcı işlevi yazmak için belki bu yüzden biraz hantal olsa da,:

/**
 * Turns an Optional<T> into a Stream<T> of length zero or one depending upon
 * whether a value is present.
 */
static <T> Stream<T> streamopt(Optional<T> opt) {
    if (opt.isPresent())
        return Stream.of(opt.get());
    else
        return Stream.empty();
}

Optional<Other> result =
    things.stream()
          .flatMap(t -> streamopt(resolve(t)))
          .findFirst();

Burada, gidermek için çağrı inlined() ayrı bir harita yerine() işlemi, ama bu zevk meselesi.

2015-02-25 GÜNCELLEŞTİRİN

Optional.stream ile İLGİLENİYORUZ 9 eklendi: JDK-8050820 changeset. Bu, herhangi bir yardımcı yöntem gerek kalmadan aşağıdaki gibi yeniden yazılması için örnek sağlar:

Optional<Other> result =
    things.stream()
          .map(this::resolve)
          .flatMap(Optional::stream)
          .findFirst();

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MotoManTV

    MotoManTV

    10 Aralık 2009
  • SDSARG3

    SDSARG3

    14 Mart 2009
  • Tylerron

    Tylerron

    6 AĞUSTOS 2006