Derzeit habe ich Code wie unten. Eine Liste, die in eine andere Liste eingebettet ist, und ich möchte die Gesamtzahl der eingebetteten Listenobjekte erhalten.

Ich möchte dafür einen kurzen Einzeiler schreiben. Gibt es einen effizienten Lambda oder FP Trick, den ich in Java 8 machen kann?

int totalNo = 0;
for (ClassB classB : listOfClassB) {
    totalNo+= classB.getAnotherObjList().size();
}
8
Saad 19 Jän. 2019 im 01:23

3 Antworten

Beste Antwort
long totalSum = listOfClassB.stream()
     .mapToInt(elem -> elem.getAnotherObjList().size())
     .sum();

Ich denke, das Ergebnis der Summe ist ein long, da mehrere Ganzzahlen den maximalen int-Wert überschreiten können. Sie können es jederzeit wirken, wenn Sie sicher sind, dass es nicht zu einem Überlauf kommt.

Es ist nicht ganz ein Einzeiler, zumindest wie oben formatiert, aber es passt wohl in einen einzelnen Ausdruck.

Wenn case und element in der ersten Liste null sind oder wenn getAnotherObjList () eine null zurückgibt, können Sie dies unterstützen, indem Sie die folgenden Fälle herausfiltern:

long totalSum = listOfClassB.stream()
     .filter(Objects::nonNull)
     .map(ClassB::getAnotherObjList)
     .filter(Objects::nonNull)
     .mapToInt(List::size)
     .sum();
9
Naman 19 Jän. 2019 im 02:50

Ein anderer Weg, Sammler zu verwenden:

int totalNo = listOfClassB.stream()
    .collect(Collectors.summingInt(classB -> classB.getAnotherObjList().size()));

Ein äquivalenter Weg, nur mit Methodenreferenzen:

int totalNo = listOfClassB.stream()
    .collect(Collectors.mapping(
             ClassB::getAnotherObjList, 
             Collectors.summingInt(List::size)));

Oder Mapping im Stream statt im Collector:

int totalNo = listOfClassB.stream()
    .map(ClassB::getAnotherObjList)
    .collect(Collectors.summingInt(List::size));
2
Federico Peralta Schaffner 19 Jän. 2019 im 16:04

Sie können auch versuchen:

listOfClassB.stream().map(ClassB::getAnotherObjList).flatMap(List::stream).count();

Dies ist sehr prägnant und elegant. Wenn ClassB::getAnotherObjList nicht zu viele Elemente zurückgibt, ist die Leistung kein Problem.

2
fastcodejava 20 Jän. 2019 im 02:27