Накапливать количество списков в другом списке - PullRequest
0 голосов
/ 19 января 2019

В настоящее время у меня есть код, как показано ниже. Список, встроенный в другой список, и я хочу получить общее количество встроенных объектов списка.

Я хочу написать быстрый переводчик для этого. Есть ли эффективный трюк с лямбдами или FP, который я могу сделать в Java 8?

int totalNo = 0;
for (ClassB classB : listOfClassB) {
    totalNo+= classB.getAnotherObjList().size();
}

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Вы также можете попробовать:

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

Это очень лаконично и элегантно.Если ClassB::getAnotherObjList не возвращает слишком много элементов, производительность не будет проблемой.

0 голосов
/ 19 января 2019

Другой способ с использованием коллекторов:

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

Эквивалентный способ, только с ссылками на методы:

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

Или отображение в потоке, а не в коллекторе:

int totalNo = listOfClassB.stream()
    .map(ClassB::getAnotherObjList)
    .collect(Collectors.summingInt(List::size));
0 голосов
/ 19 января 2019
long totalSum = listOfClassB.stream()
     .mapToInt(elem -> elem.getAnotherObjList().size())
     .sum();

Я думаю, что результатом суммы будет long, так как несколько целых чисел могут идти до значения max int;вы всегда можете разыграть его, если уверены, что это не приведет к переполнению.

Это не совсем одна строка, по крайней мере, как отформатировано выше, но, возможно, она вписывается в одно выражение.

Если case и element в первом списке имеют значение null или если getAnotherObjList () возвращает null, вы можете поддержать это, отфильтровав эти случаи:

long totalSum = listOfClassB.stream()
     .filter(Objects::nonNull)
     .map(ClassB::getAnotherObjList)
     .filter(Objects::nonNull)
     .mapToInt(List::size)
     .sum();
...