SORU
12 ŞUBAT 2013, Salı


Alınıyor bir java bir Listesini.açıklama.stream.Stream Java8 içinde

Java 8 Lambda ile kolayca derlemeleri filtrelemek için oynuyordum. Ama aynı açıklama içinde yeni bir liste olarak sonuç almak için kısa bir yol bulamadım. İşte en özlü yaklaşımım şu ana kadar:

List<Long> sourceLongList = Arrays.asList(1L, 10L, 50L, 80L, 100L, 120L, 133L, 333L);
List<Long> targetLongList = new ArrayList<>();
sourceLongList.stream().filter(l -> l > 100).forEach(targetLongList::add);

Net yeni örnekleri sonuç listesi oluşturmadan durdurmak çünkü soruma cevap vermedi. Daha kısa bir yolu olmalı. Beklerdim, Akış sınıfı toList gibi yöntemleri(), ayarlamanızı(), ...

Orada değişken bir şekildetargetLongListdoğrudan üçüncü satır tarafından atanmış olabilir?

CEVAP
12 ŞUBAT 2013, Salı


Ne yaptığını en basit yol olabilir, akışı sıralı-sağlanan kalır;aksi halde sıralı bir çağrı koymak zorunda kalacak () forEach önce.

[sonra edit: sebebi sıralı çağrısı() gereklidir haliyle kodu (forEach(targetLongList::add)) stream paralel olsaydı ayıp olurdu. O zaman bile, forEach açıkça belirleyici olmayan-olduğu gibi amaçlanan etki elde etmek değil;hatta sıralı bir akış içinde öğe işleme sırasını garanti edilmez. forEachOrdered doğru sipariş sağlamak için kullanmak gerekir. Stream API tasarımcıların niyeti bu durumda toplayıcı olarak kullanınız.]

Bir alternatiftir

targetLongList = sourceLongList.stream()
    .filter(l -> l > 100)
    .collect(Collectors.toList());

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • hotstrikegently

    hotstrikegen

    26 AĞUSTOS 2011
  • Matus Slovak

    Matus Slovak

    5 Temmuz 2007
  • Michelle Phan

    Michelle Pha

    18 Temmuz 2006