拆分列表,然后排序

时间:2018-12-21 19:06:13

标签: java java-stream grouping

我想要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 :(得分:5)

您可以流式传输这些值,然后收集到一个列表中:

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