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

  • Doug Bernards

    Doug Bernard

    7 Kasım 2007
  • psidot

    psidot

    2 Kasım 2006
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008

İLGİLİ SORU / CEVAPLAR