Java 8 Streams - 分组为单值

Joh*_*ett 6 java java-8 java-stream

我目前正在处理List<Map<String, Object>>我试图在地图中的各种键之间进行分组的位置.这似乎很好地使用Java 8 Stream:

Map<Object, Map<Object, List<Map<String, Object>>>> collect =
   list
   .stream()
   .collect(Collectors.groupingBy(
       item -> item.get("key1"),
       Collectors.groupingBy(item -> item.get("key2"))
   ));
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这给了我一个Map<Object, Map<Object, List<Map<String, Object>>>>在可能的分组结果大于1的情况下运行良好的情况.

我有各种例子,例如,正在进行的分组总是会导致最低级别列表中的单个项目.

行列表

{
  [reference="PersonX", firstname="Person", dob="test", lastname="x"],
  [reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]
}
Run Code Online (Sandbox Code Playgroud)

通过引用分组

目前 - 分组为1列表 Map<String,Object>

[PersonX, { [reference="PersonX", firstname="Person", dob="test", lastname="x"]}],
[JohnBartlett, { [reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]}]
Run Code Online (Sandbox Code Playgroud)

偏好 - 没有列表只是一个 Map<String,Object>

[PersonX, [reference="PersonX", firstname="Person", dob="test", lastname="x"]],
[JohnBartlett, [reference="JohnBartlett", firstname="John", dob="test", lastname="Bartlett"]]
Run Code Online (Sandbox Code Playgroud)

在流中是否有一种方法可以强制这些实例的输出Map<Object, Map<Object, Map<String, Object>>>- 所以只有一个Map<String,Object>而不是List它们中的一个?

任何帮助将不胜感激.

Eug*_*ene 11

如果我理解正确,那么对于您确定只有一个项目的情况,您应该只需要替换:

 .collect(Collectors.groupingBy(
   item -> item.get("key1"),
   Collectors.toMap(item -> item.get("key2"), Function.identity())
 ));
Run Code Online (Sandbox Code Playgroud)

您甚至可以提供第三个参数作为BinaryOperator合并相同的条目(如果您需要)


M. *_*tin 5

Collectors.toMap()正是您想要做的事情。

Map<Object, Map<String, Object>> collect = maps.stream()
        .collect(Collectors.toMap(p -> p.get("reference"), Function.identity()));
Run Code Online (Sandbox Code Playgroud)

输出:

Map<Object, Map<String, Object>> collect = maps.stream()
        .collect(Collectors.toMap(p -> p.get("reference"), Function.identity()));
Run Code Online (Sandbox Code Playgroud)

如果您有重复的键,这将抛出一个错误IllegalStateException,当您从未期望数据中存在重复记录时,这可能正是您想要的:

{
  PersonX={firstname=Person, reference=PersonX, lastname=x, dob=test},
  JohnBartlett={firstname=John, reference=JohnBartlett, lastname=Bartlett, dob=test}
}
Run Code Online (Sandbox Code Playgroud)