Soru Java 8 akışı - nesnelerin toplamı


Diyelim ki aşağıdaki arayüzleri uygulayan bir nesne listesi var:

public interface Summable<T> {
    T add(T o1);
}

Diyelim ki, bu nesneleri toplamayı başaran bazı sınıflarım var:

public class Calculator<T extends Summable<T>> {
    public T sum(final List<T> objects) {
        if (null == objects) {
            throw new IllegalArgumentException("Ups, list of objects cannot be null!");
        }
        T resultObject = null;
        for (T object : objects) {
            resultObject = object.add(resultObject);
        }
        return resultObject;
   }
}

Java 8 akışlarını kullanarak aynı şeyi nasıl yapabilirim?

Özel bir Koleksiyoncu etrafında oynuyorum, ama temiz bir çözüm bulamadım.


18
2018-05-03 20:55


Menşei


Muhtemelen olması gerektiği gibi görünüyor public interface Summable<T extends Summable<T>> - Paul Boddington
Mutlaka, Hesap Makinesi var ve sanırım yeterli. - Piotr Kozlowski
Soruyla doğrudan alakalı değil, örneğinizderesultObject her zaman boş olacaktır. - CKing
Sadece ilk iterasyonda, ama ne anlamı var? Daha iyi bir fikrin var mı? Nasıl yazabilirim? - Piotr Kozlowski


Cevaplar:


Sahip olduğun şey bir indirgeme:

return objects.stream().reduce(T::add).orElse(null);

23
2018-05-03 20:59





list.stream().reduce(Summable::add);

interface Summable {
    Summable add(Summable o1);
}

2
2018-05-03 21:09