Sayı 0'a eşit olduğunda bir akışla sınır (numara) çağrısını nasıl atlayabilirim?


19

Nesneleri sağlayan bazı Java kodu var items. Bunları aşağıdakilere dayalı olarak sınırlar maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

Düzgün çalışır, ancak soru şudur: Zaman sınırlamasını atlamanın bir yolu var mı maxNumber == 0?

Bunu yapabileceğimi biliyorum:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

Ama belki daha iyi bir yol var, aklınıza bir şey geliyor mu?

Yanıtlar:


15

Sanırım

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

2 ^ 63-1'den fazla öğeye sahip bir akışla başa çıkmanız pek olası olmadığından hile yapacak ...

En azından bununla ilgili paralel akışlara dikkat edin ... API dokümanlarındaki bir not şöyle diyor:

API Notu : limit()Sıralı akış boru hatlarında genellikle ucuz bir işlem olmakla birlikte , özellikle paralel maksSize değerleri için sıralı paralel boru hatlarında oldukça pahalı olabilir ...


evet, bu hile yaptı, teşekkürler!
randomuser1

20

Hayır, akış boru hattı, boru hattının herhangi bir kısmının etrafında gerçekten atlanmasına izin vermez , bu nedenle adımların içindeki koşullu mantıkla ve limit()her zaman boru hattında her zaman dahil olmak üzere veya akışı olacak parçalar halinde oluşturmak zorunda kalırsınız . sorudaki if / else değerinden biraz daha okunaklı (IMHO)

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

Burada olduğu gibi basit bir durumda çok fazla fark yaratmaz, ancak normal kod koleksiyonlarında genellikle yöntemlerden geçirildiğini, akışlara dönüştürüldüğünü ve sonra koleksiyonlara geri döndüğünü görürsünüz. Bu gibi durumlarda, gerçekten ihtiyacınız olana kadar parçalar halinde akışlarla çalışmak daha iyi bir fikir olabilir collect().

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.