Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可选。orElse:如何继续流?_Java_Java Stream_Optional - Fatal编程技术网

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?我不这么认为。根据JavaDoc
stream.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"));