将列表拆分为包含相同数字的子列表

tan*_*nia 3 java arrays functional-programming java-8 java-stream

我正在寻找功能性的java 8解决方案,解决将数组拆分为包含相等元素的子列表的问题;

即:

ArrayList.asList(1,2,2,3,4,4,4) -->  List([1],[2,2],[3], [4,4,4])
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法只得到计算这些元素的解决方案:

Map<Integer,Integer> count = lst.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
Run Code Online (Sandbox Code Playgroud)

得到一个计数值的地图,这是不够好的.

很高兴得到一些提示,我想我确实需要先以某种方式映射,然后获取entrySet;

Rob*_*per 5

List<List<Integer>> list = Arrays.asList(1,2,2,3,4,4,4).stream()
    // grouping gets you a Map<Integer,List<Integer>>
    .collect(Collectors.groupingBy(s -> s)) 
    // take the values of this map and create of stream of these List<Integer>s
    .values().stream()   
    // collect them into a List
    .collect(Collectors.toList());   
Run Code Online (Sandbox Code Playgroud)

打印结果会获得所请求的列表列表:

System.out.println(list);
Run Code Online (Sandbox Code Playgroud)

[ 1,[2,2],[3],[4,4,4]]


编辑:Alexis C.对此替代方案的信用:

Arrays.asList(1,2,2,3,4,4,4).stream()
   .collect(collectingAndThen(groupingBy(s -> s), m -> new ArrayList<>(m.values())));
Run Code Online (Sandbox Code Playgroud)

  • 你冷也使用`collectingAndThen`:`list.stream().collect(collectingAndThen(groupingBy(s - > s),m - > new ArrayList <>(m.values()))); (3认同)