Как я могу получить размер самого большого списка из списка списков, используя потоки Java 8? - PullRequest
0 голосов
/ 25 мая 2018

Скажите, что у меня следующий список списков "

List l1 = Arrays.asList(1,2,3,4);
List l2 = Arrays.asList(1,2,3,4,5);
List l3 = Arrays.asList(1,2,3,4,5,6);
List<List> lists = Arrays.asList(l1,l2,l3);

Как узнать размер самого большого списка с помощью API потоков Java 8? Я думал, что-то вроде этого будет работать:

lists.stream().reduce(Integer.MIN_VALUE, (a,b) -> Integer.max(a.size(), b.size()));

Но по понятным причинам это дает мне:

Type mismatch: cannot convert from int to List

Как я могу сделать выше, используя потоки Java 8? (И также, если есть какой-либо другой лучший подход)

Также я могу получить ссылку на список с максимальным размером?

Ответы [ 6 ]

0 голосов
/ 25 мая 2018
final int maxSize = lists.stream().map(List::size).max(Integer::compare).orElse(0);
0 голосов
/ 25 мая 2018

Если вы когда-нибудь застряли с

int max = 0;
for (List list : lists) {
    if (list.size() > max) {
        max = list.size();
    }
}
0 голосов
/ 25 мая 2018

Чтобы получить самый длинный список с помощью Reduce, вы можете сделать:

    Optional<List> list=lists.stream().reduce((a, b) -> a.size()>b.size()? a:b);

Это сводит ваш список строк к одному списку на основе размера (этот список является необязательным).Чтобы напечатать его размер, вы можете сделать:

    list.ifPresent((a)-> System.out.println(a.size()));

Или один вкладыш будет:

    lists.stream().reduce((a, b) -> a.size()>b.size()? a:b).ifPresent((a)-> System.out.println(a.size()));
0 голосов
/ 25 мая 2018

Вы можете использовать операцию карты, чтобы получить размер, а не уменьшить, затем вы можете найти максимум с помощью встроенного метода max (который возвращает OptionalInt, поэтому вы используете get для возвратаint)

lists.stream().mapToInt(x -> x.size()).max().getAsInt()
0 голосов
/ 25 мая 2018

Вы можете просто позвонить max:

lists.stream().mapToInt(List::size).max().getAsInt()

И взять список с самым большим размером:

lists.stream().max(Comparator.comparing(List::size)).get()
0 голосов
/ 25 мая 2018

Если вам нужно знать только размер, но не сам список.

List l1 = Arrays.asList(1,2,3,4);
List l2 = Arrays.asList(1,2,3,4,5);
List l3 = Arrays.asList(1,2,3,4,5,6);
List<List> lists = Arrays.asList(l1,l2,l3);
lists.stream().map(List::size).max(Comparator.naturalOrder()).get();
...