如何使用Java Streams实现List转默认值Map及多字段Set
代码修正与实现方案
一、生成Map<String, Boolean>的错误修正
你原来的Collectors.toMap写法编译不通过的核心原因是:toMap的两个入参都要求是Function类型的映射规则,第一个参数定义如何从流元素提取Map的键,第二个参数定义如何从流元素提取Map的值,你直接传入常量Boolean.FALSE不符合函数式接口的传参要求。
修正后的代码如下,额外增加了重复键的合并逻辑,避免列表中存在重复UCC时抛出IllegalStateException:
Map<String, Boolean> pendingUcc = pendingBseUsers.stream() .collect(Collectors.toMap( ExchangeTradeStatus::getUcc, user -> Boolean.FALSE, (oldVal, newVal) -> oldVal ));
二、无需自定义类实现双字段Set的方案
不需要额外编写UccTradingPermission自定义类,JDK自带的键值对类就可以满足存储两个字段的需求:
- Java 8及以上版本可以使用
AbstractMap.SimpleEntry实现:
import java.util.AbstractMap; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; // 省略其他业务代码 Set<Map.Entry<String, Boolean>> pendingBseUcc = pendingBseUsers.stream() .map(user -> new AbstractMap.SimpleEntry<>(user.getUcc(), Boolean.FALSE)) .collect(Collectors.toSet());
- Java 9及以上版本可以直接使用
Map.entry静态方法,写法更简洁:
Set<Map.Entry<String, Boolean>> pendingBseUcc = pendingBseUsers.stream() .map(user -> Map.entry(user.getUcc(), Boolean.FALSE)) .collect(Collectors.toSet());
注意:如果你坚持使用自定义的
UccTradingPermission类,必须重写类的equals()和hashCode()方法,否则存入HashSet时会出现内容相同的对象被判定为不同元素、去重失效的问题。
内容的提问来源于stack exchange,提问作者Aditya K
相关产品推荐
相关产品推荐

