将对象列表转换为Java中的可选对象列表

ken*_*rey 7 java java-8

以下代码将对象列表转换为可选对象列表.使用Java 8的流有没有一种优雅的方法呢?

List<Object> originalList = Arrays.asList(new Object(), new Object());
List<Optional<Object>> convertedList = new ArrayList<>();
for (Object object : originalList) {
    convertedList.add(Optional.of(object));
}
Run Code Online (Sandbox Code Playgroud)

我尝试了下面这段代码.

List<Optional<Object>> convertedList = originalList.stream().map((o) -> Optional.of(o));
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下编译错误:

of(T) in Optional cannot be applied to (java.lang.Object)
Run Code Online (Sandbox Code Playgroud)

这是使用java.util.Optional类而不是Guava类.

Ale*_* C. 8

你忘了收集Stream列表中的元素.它应该是:

List<Optional<Object>> convertedList  = originalList.stream()
                                                    .map((o) -> Optional.of(o))
                                                    .collect(Collectors.toList()); 
                                               //or .collect(Collectors.toCollection(LinkedList::new)); if you want a specific List implementation
Run Code Online (Sandbox Code Playgroud)

请注意,您可以避免创建lamdba并在此情况下使用方法引用.map(Optional::of).

我不明白为什么你会得到ListOptional,如果你事先知道在列表中的元素非空.也许只是为了实践Java 8,但正如@Eran所说,你应该使用它Optional::ofNullable.

  • 虽然我建议在lambda表单上使用方法ref表单,但不要通过使用方法引用表单来欺骗自己"避免创建lambda".方法refs通过与lambdas相同的机制转换为功能接口.但是,这些决定应该在99.999%的时间内基于代码可读性/可维护性做出,所以你应该选择更具可读性的东西 - 通常是方法参考. (2认同)

Era*_*ran 5

您似乎忘了将Stream收集到列表中:

List<Optional<Object>> convertedList = 
    originalList.stream()
                .map((o) -> Optional.ofNullable(o))
                .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

您应该使用ofNullable,因为of需要一个非null对象(它将NullPointerException在传递空引用时抛出).