Optional.orElse:如何继续流?

我想使用 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");

其中 orOptional 类似于: // 如果此 Optional 中存在值,则返回此可选,否则返回 fallback Optional orOptional(Optional fallback)


编辑 2018-10-15:为了不被我在示例中使用地图的事实所困扰,让我们假设这些只是一些带有 getter 值的 bean。bean 可以为 null,或者 getter 返回的值可以为 null。



慕无忌1623718
浏览 194回答 2
2回答

九州编程

你不需要.map(map -> map.get(key))&nbsp; &nbsp; &nbsp; &nbsp; .map(Optional::of)Optional.map也返回Optional。你可以写Optional.ofNullable(map1)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(map -> map.get(key))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .orElseGet(() ->&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Optional.ofNullable(map2)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(map -> map.get(key)).orElse("default")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );此外,您可以创建一个映射流,然后进行一些转换:Stream.of(map1, map2)&nbsp; .filter(Objects::nonNull)&nbsp; .map(m -> m.get(key))&nbsp; .filter(Objects::nonNull)&nbsp; .findFirst()&nbsp; .orElse("default");

明月笑刀无情

让地图变量变成null.如果您无法修复映射的来源,您至少应该在null处理过程中尽早引入包含非映射的局部变量。Map<String,String>&nbsp;m1&nbsp;=&nbsp;map1&nbsp;==&nbsp;null?&nbsp;Map.of():&nbsp;map1,&nbsp;m2&nbsp;=&nbsp;map2&nbsp;==&nbsp;null?&nbsp;Map.of():&nbsp;map2;Map.of()需要 Java 9。在 Java 8 中,您可以Collections.emptyMap()改为使用。那么,你的任务就这么简单String&nbsp;value1&nbsp;=&nbsp;m1.getOrDefault(key,&nbsp;m2.getOrDefault(key,&nbsp;"default"));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java