我想使用Stream方法,但是我觉得它不太理想。我想避免造成混淆
.map(Optional::of)
是否可以使下面的方法2避免这种额外的混乱,是否可以使用一种可选方法来实现我想要的?
// Either map can be null, empty, or have the value for key
Map<String,String> map1 =
Map<String,String> map2 =
// Method #1
String 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 #2
String 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");
其中or可选的内容如下: //如果此Optional中存在值,则返回此Optional,否则返回fallback 可选或可选(可选后备)
编辑2018-10-15:为了避免卡住示例中的地图这一事实,让我们假设这些只是一些带有getter值的bean。 bean可以为null,或者getters返回的值可以为null。
答案 0 :(得分:2)
您不需要
.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");
答案 1 :(得分:1)
让映射变量成为null
时存在一个基本的设计错误。
如果您无法确定地图的来源,则至少应在处理过程中尽早引入保存非{null
地图的局部变量。
Map<String,String> m1 = map1 == null? Map.of(): map1, m2 = map2 == null? Map.of(): map2;
Map.of()
需要Java9。在Java 8中,可以改为使用Collections.emptyMap()
。
然后,您的任务就很简单
String value1 = m1.getOrDefault(key, m2.getOrDefault(key, "default"));