从List of Maps List收集特定键值<string,

时间:2015-11-10 07:05:34

标签: java list dictionary java-stream

=“”

我正在解析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,请告诉我。

2 个答案:

答案 0 :(得分:3)

您不需要在collectmap,然后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()进行交换,可以轻松完成此操作。

[1] Oracle tutorial on stream parallelism