2015-05-03 14 views
18

Lassen Sie uns sagen, ich habe eine Liste von Objekten unterhalb Schnittstelle implementiert:Java 8 Strom - Summe von Objekten

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

Sagen wir, ich habe auch einige Klasse, die diese Objekte zu summieren ist in der Lage:

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; 
    } 
} 

Wie erreiche ich dasselbe mit Java 8 Streams?

Ich spiele um einen benutzerdefinierten Collector, konnte aber keine saubere Lösung finden.

+0

Es sieht aus wie es wahrscheinlich 'öffentliche Schnittstelle sein sollte summierbaren >' –

+0

Nicht notwendigerweise, Rechner, und es ist genug I annehmen. –

+0

Nicht direkt mit der Frage verwandt, aber in Ihrem Beispiel ist 'resultObject' immer Null. – CKing

Antwort

23

Was Sie haben, ist ein reduction:

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

interface Summable { 
    Summable add(Summable o1); 
}