Maj*_*jky 4 java java-8 java-stream
我想在java中使用流来根据多个字段对长对象列表进行分组.这将导致列表地图的地图的地图的地图的地图.
我怎样才能从该复杂流中提取列表?
以下是一些示例代码示例(字符串列表,查找具有相同长度和首字母的组).我对密钥不感兴趣,只是在生成的分组实体中.
List<String> strings = ImmutableList.of("A", "AA", "AAA", "B", "BB", "BBB", "C", "CC", "CCC", "ABA", "BAB", "CAC");
Map<Character, Map<Integer, List<String>>> collect = strings.stream().collect(
groupingBy(s -> s.charAt(0),
groupingBy(String::length)
)
);
Run Code Online (Sandbox Code Playgroud)
这将产生以下结果
My Map =
{
A =
{
1 = [A]
2 = [AA]
3 = [AAA, ABA]
}
B =
{
1 = [B]
2 = [BB]
3 = [BBB, BAB]
}
C =
{
1 = [C]
2 = [CC]
3 = [CCC, CAC]
}
}
Run Code Online (Sandbox Code Playgroud)
我感兴趣的实际上只是上面结果中的列表,我想在理想情况下将其作为groupby操作的一部分.我知道可以通过循环生成的地图结构来完成.但有没有办法使用流来实现它?
[
[A],
[AA],
[AAA, ABA],
[B],
[BB],
[BBB, BAB],
[C],
[CC],
[CCC, CAC]
]
Run Code Online (Sandbox Code Playgroud)
Collectors.groupingBy您应该使用复合键进行分组,而不是使用级联创建嵌套组:
Map<List<Object>, List<String>> map = strings.stream()
.collect(Collectors.groupingBy(s -> Arrays.asList(s.charAt(0), s.length())));
Run Code Online (Sandbox Code Playgroud)
然后,只需抓取地图值:
List<List<String>> result = new ArrayList<>(map.values());
Run Code Online (Sandbox Code Playgroud)
如果你是在Java的9+,你可能想改变Arrays.asList,以List.of创建组合键.
这种方法对你的情况非常有效,因为你声明你对保持密钥不感兴趣,并且因为List两者都返回了实现,Arrays.asList并且List.of在它们equals和hashCode方法方面都有明确的定义,即它们可以安全地用作任何密钥.Map.
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |