在Java8中有没有更优雅的方法来实际实现这一点呢?
list.stream()
.map(e -> myclass.returnsOptional(e))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
我说的是筛选器(可选::IsPresent)
后跟映射(可选::Get)
,我想在列表中优雅地收集具有值的可选
结果。
在您的情况下,可以使用一个FlatMap
,而不是Map
Filter
和Map
的组合。为此,最好为创建流定义一个单独的函数:public private static stream
,以便在lambda表达式中没有几行代码。
请参阅我的完整演示示例:
public class Demo{
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
List<Integer> newList = list.stream()
.flatMap(Demo::createStream)
.collect(Collectors.toList());
System.out.println(newList);
}
public static Stream<Integer> createStream(String e) {
Optional<Integer> opt = MyClass.returnsOptional(e);
return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
}
}
class MyClass {
public static Optional<Integer> returnsOptional(String e) {
try {
return Optional.of(Integer.valueOf(e));
} catch (NumberFormatException ex) {
return Optional.empty();
}
}
}
如果returnsOptional不能是静态的,则需要使用“箭头”表达式而不是“方法引用”
问题内容: 如何在显示时删除可选值上的文本而不必强制输入。 更新资料 当会话具有值时,其具有值: 问题答案: 您可以使用(null合并运算符)解开它,并提供默认值(如果为nil)
我有一个Web应用程序,它的日志非常多。我们为每个请求线程实现了对的调用,以便能够在日志中跟踪用户。 日志消息可以如下所示: 现在的问题是,大多数情况下,不存在当前用户,并且我们不能使用上面日志示例中的字段。因此,它将看起来像这样: 有没有办法不写MDC密钥 我希望它看起来像这样,如果没有找到MDC值: 以上(MDC)示例配置如下:
问题内容: 如何通过使用和避免返回值? 例: 问题答案: 要返回可选值的值,或者返回默认值(如果可选值没有值),则可以使用。 请注意,我重写了查找最长名称的代码:您可以直接与比较器比较每个String的长度。可以通过调用键提取器作为方法引用来获得一个这样的比较器。
当我想检查可选布尔值是否为真时,这样做行不通: 它会导致以下错误: 可选类型“@IvalueBool?”不能用作布尔值;测试'!=而不是零 我不想检查nil;我想检查返回的值是否为真。 如果布尔值==true,我是否总是必须执行
问题内容: 在阅读The Swift Programming Language时 ,我遇到了以下片段: 您可以使用 if 和 let 一起使用可能缺少的值。这些值表示为 optionals 。可选值包含一个值或包含nil来指示该值丢失。在值的类型后写一个问号(?),以将该值标记为可选。 片段1很清楚,但是片段2发生了什么?有人可以分解并解释吗?它只是使用块的替代方法吗?在这种情况下的确切作用是什么
问题内容: 从Apple的文档中: 您可以使用和一起使用可能缺少的值。这些值表示为可选值。可选值包含一个值或包含一个指示该值丢失的值。在值的类型后写一个问号(),以将该值标记为可选。 为什么要使用可选值? 问题答案: Swift中的可选类型是可以保存值或不保存值的类型。通过将a附加到任何类型来编写可选内容: 可选(以及泛型)是最难理解的Swift概念之一。由于它们是如何编写和使用的,很容易对它们是