如何使用 Java Streams 从 HashMap 的 ArrayList 中获取字符串

Posted

技术标签:

【中文标题】如何使用 Java Streams 从 HashMap 的 ArrayList 中获取字符串【英文标题】:How to use Java Streams to fetch Strings from an ArrayList of HashMaps 【发布时间】:2018-09-16 05:23:21 【问题描述】:

我有一个数据结构 - ArrayList> 这就是我需要做的 -

ArrayList<HashMap<String, String>> optMapList;
//populated optMapList with some code. Not to worry abt this

List<String> values = new ArrayList<String>();

for(HashMap<String,String> entry: optMapList)
    values.add(entry.get("optValue"));

我们如何使用 Java Streams 来实现相同的目标?

【问题讨论】:

【参考方案1】:
 optMapList.stream()
           .filter(Objects:nonNull) // potentially filter null maps
           .map(m -> m.get("optValue"))
           .filter(Objects::nonNull) // potentially filter null values form the map 
           // .collect(Collectors.toCollection(ArrayList::new)) 
           .collect(Collectors.toList())

【讨论】:

利用 toCollection 保证返回的 List 的类型。 @Aominè 顺便说一句,这实际上是一个非常好的观点,Stuart Marks 的评论正在考虑更改 toList 以便它返回一个不可变的列表,就像 jdk-10 中的 toUnmodifiableList ... filter 不应该在map 之前吗? @lexicore 我知道,因此其中的潜在词...我喜欢你今天的一丝不苟;) 插入虚假的null 检查弊大于利。原始代码表明 OP 假定映射永远不会是 null,因此当这个假设不成立时,代码应该大声失败,而不是默默地跳过条目。对于这些值,我们不知道它们是否应该始终存在且非null,或者是否有意在结果列表中包含null 条目。在任何一种情况下,原始代码都保证源列表位置与结果列表位置匹配,并且插入过滤器会破坏此不变量。

以上是关于如何使用 Java Streams 从 HashMap 的 ArrayList 中获取字符串的主要内容,如果未能解决你的问题,请参考以下文章

如果使用我的服务使用Java 8 lambda / streams列表不为空,如何从列表中删除每个元素

如何(不)在Java 9+中使用Reactive Streams

使用 Java 8 Streams 从列表中仅获取所需的对象

如何使用 Java Streams API 添加和更新地图条目

如何使用Java Streams API正确过滤开始日期和结束日期之间的日期?

使用 Java Streams 和 Spring Boot 的 RESTful Web 服务