如何使用 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 添加和更新地图条目