我正在解析Java类中服务器的JSON响应。我们有实用功能将JSON转换为List<Map<String, Object>>
。
现在我想从所有对象中收集特定键的值。例如,我收到的JSON是人的数据,如下面的
[
{
name:'abc',
city: 'Hyd'
},
{
name:'def',
city:'NYC'
}
]
我想尝试Java8流API来完成这项工作,所以这就是我写的方式
List<Map<String,Object>> answer = parseJSONReponse(response);
List<Object> collect = answer.stream().map(
m -> m.entrySet().stream()
.filter(e-> e.getKey().equals("name"))
.map(e -> e.getValue())
.collect(Collectors.toList())
).flatMap(l->l.stream()).collect(Collectors.toList());
如果有更好的编写此流API,请告诉我。
答案 0 :(得分:3)
您不需要在collect
内map
,然后flatMap
,因为您正在创建不必要的中间列表。只需直接使用flatMap
:
List<Object> collect = answer.stream().flatMap(
m -> m.entrySet().stream()
.filter(e-> e.getKey().equals("name"))
.map(e -> e.getValue())
).collect(Collectors.toList());
答案 1 :(得分:0)
您可以考虑使用并行流。
请注意,并行性并不比串行执行操作更快,尽管可能有足够的数据和处理器内核。虽然聚合操作使您能够更轻松地实现并行性,但您仍有责任确定您的应用程序是否适合并行性。 [1]
通过将stream()
方法与parallelStream()
进行交换,可以轻松完成此操作。