我想使用 Stream 方法,但我觉得它有点次优。我想避免混淆.map(Optional::of)是否可以使用下面的方法 #2 来避免这种额外的混淆,是否有可选的方法可以用来实现我想要的?// Either map can be null, empty, or have the value for keyMap<String,String> map1 = Map<String,String> map2 = // Method #1String value1 = null;if (map1 != null) { value1 = map1.get(key);}if (value1 == null) { if (map2 != null) { value1 = map2.get(key); }}if (value1 == null) value1 = "default";// Method #2String value2 = Optional.ofNullable(map1) .map(map -> map.get(key)) .map(Optional::of) .orElse(Optional.ofNullable(map2).map(map -> map.get(key))) .orElse("default");assertEquals(value1, value2);我想要这样的东西:Optional.ofNullable(map1) .map(map -> map.get(key)) .orOptional(Optional.ofNullable(map2).map(map -> map.get(key))) .orElse("default");其中 orOptional 类似于: // 如果此 Optional 中存在值,则返回此可选,否则返回 fallback Optional orOptional(Optional fallback)编辑 2018-10-15:为了不被我在示例中使用地图的事实所困扰,让我们假设这些只是一些带有 getter 值的 bean。bean 可以为 null,或者 getter 返回的值可以为 null。
2 回答
九州编程
TA贡献1785条经验 获得超4个赞
你不需要
.map(map -> map.get(key))
.map(Optional::of)
Optional.map也返回Optional。你可以写
Optional.ofNullable(map1)
.map(map -> map.get(key))
.orElseGet(() ->
Optional.ofNullable(map2)
.map(map -> map.get(key)).orElse("default")
);
此外,您可以创建一个映射流,然后进行一些转换:
Stream.of(map1, map2)
.filter(Objects::nonNull)
.map(m -> m.get(key))
.filter(Objects::nonNull)
.findFirst()
.orElse("default");
明月笑刀无情
TA贡献1828条经验 获得超4个赞
让地图变量变成null
.
如果您无法修复映射的来源,您至少应该在null
处理过程中尽早引入包含非映射的局部变量。
Map<String,String> m1 = map1 == null? Map.of(): map1, m2 = map2 == null? Map.of(): map2;
Map.of()
需要 Java 9。在 Java 8 中,您可以Collections.emptyMap()
改为使用。
那么,你的任务就这么简单
String value1 = m1.getOrDefault(key, m2.getOrDefault(key, "default"));
添加回答
举报
0/150
提交
取消