Разделить список, а затем отсортировать - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу противоположность flatMap.У меня есть код ниже:

List<String> list = Arrays.asList("A", "C", "B", "AA", "BB", "CC");
Stream<String> stream = list.stream();
Collection<List<String>> val = stream.sorted().collect(groupingBy(String::length)).values();
System.out.println("Values " + val);

Это работает, но тип Collection<List<String>>.Как мне сделать это List<List<String>>?

Я могу перебрать Collection или использовать new Arraylist().Я ищу что-то вроде Arrays.asList, которое было бы более лаконичным и неизменным.

Если я произнесу, я получу java.lang.ClassCastException.

Также это отсортирует весь список и затем выполнитгруппировка.Есть ли способ сначала сгруппировать, а затем отсортировать меньшие списки, которые были бы более эффективными.

1 Ответ

0 голосов
/ 21 декабря 2018

Вы можете выполнить потоковую передачу значений и затем собрать их в список:

 List<List<String>> values = list.stream()
                .sorted()
                .collect(groupingBy(String::length))
                .values()
                .stream()
                .collect(toList());

Но лучшим подходом было бы передать результат конструктору ArrayList, как в:

List<List<String>> values = new ArrayList<>(list.stream()
              .sorted().collect(groupingBy(String::length)).values());

если вы хотите отсортировать после группировки, вы можете сделать:

List<List<String>> values = new ArrayList<>(list.stream()
                .collect(groupingBy(String::length))
                .values());            
values.forEach(Collections::sort);
...