我想要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
。
这还将对整个列表进行排序,然后进行分组。 有没有一种方法可以先进行分组,然后对较小的列表进行排序,这样会更有效率。
答案 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);