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

时间:2014-12-31 13:53:27

标签: 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));
}

我尝试了下面这段代码。

List<Optional<Object>> convertedList = originalList.stream().map((o) -> Optional.of(o));

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

of(T) in Optional cannot be applied to (java.lang.Object)

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

2 个答案:

答案 0 :(得分: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

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

如果您事先知道列表中的元素是非空的,我不明白为什么会得List OptionalOptional::ofNullable也许只是为了实践Java 8,但是@Eran说你应该使用{{1}}代替。

答案 1 :(得分:5)

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

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

您应该使用ofNullable,因为of需要非空对象(传递空引用时会抛出NullPointerException。)