Java 可选。orElse:如何继续流?
我想使用流方法,但我觉得它有点次优。我想避免混淆Java 可选。orElse:如何继续流?,java,java-stream,optional,Java,Java Stream,Optional,我想使用流方法,但我觉得它有点次优。我想避免混淆 .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 = n
.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);
其中或可选的是:
//如果此可选项中存在值,则返回此可选项,否则返回回退
可选或可选(可选回退)
编辑2018-10-15:为了不被我在示例中使用地图这一事实所困扰,让我们假设这些只是一些具有getter值的bean。bean可以为null,或者getter返回的值可以为null 你不需要
.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");
让map变量变为
null
是一个基本的设计错误
如果无法修复映射的源,则至少应在处理过程中尽早引入包含非空映射的局部变量
Map<String,String> m1 = map1 == null? Map.of(): map1, m2 = map2 == null? Map.of(): map2;
如果我正确理解了您的需要-有两种方法,如
orElse
和orElseGet
。在Java 9中,有一种方法:'或':@user_3380739,正是我想要的!太糟糕了,我在8上。“映射可以为null、空,或者具有key的值”,这就是问题所在。首先不要让映射为null
。不需要第二个.filter(m->m!=null)
(或者在.map和.findfirst之间过滤(Objects::nonNull)
,否则如果m.get(key)
返回null,findfirst
将抛出一个NPE。@DodgyCodeException您肯定是对的。我更新了我的答案。@dehasi,实际上我更喜欢我原来的方法,因为它在顶层有orElse(“默认值”)(不嵌套在另一个可选映射中)。对于读者来说,很明显,无论嵌套选项中发生什么,都有默认的回退值。您可以使用映射流的第二个解决方案。如果存在,它是否保证findFirst()来自映射1?我不这么认为。根据JavaDocstream.of(…)
返回返回序列{@link stream}
。它不保证findFirst()将来自map1吗?在第一个解决方案中,您可以用orElseGet(…)替换orElse(…)
以避免在任何时候创建和计算第二个可选
。您是对的,但是让我们用一些getter替换一些任意对象,从而使问题更一般化。并且假设其中一个对象可以为null,或者getter返回值可以为null。
Map<String,String> m1 = map1 == null? Map.of(): map1, m2 = map2 == null? Map.of(): map2;
String value1 = m1.getOrDefault(key, m2.getOrDefault(key, "default"));