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

  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • Google

    Google

    18 EYLÜL 2005