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

时间:2017-05-01 10:49:15

标签: 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])

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

Map<Integer,Integer> count = lst.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));

会产生一个count - value的映射,这还不够好。

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

1 个答案:

答案 0 :(得分: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());   

打印结果可以获得所需的列表列表:

System.out.println(list);
  

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