Optional.orElse:如何继续播放流?

时间:2018-10-03 12:17:45

标签: java java-stream optional

我想使用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。

2 个答案:

答案 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"));