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

dfty9e19  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(155)

下面的代码将一个对象列表转换为一个可选对象列表。有没有一种优雅的方法可以使用Java8的流来实现这一点?

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类。

w3nuxt5m

w3nuxt5m1#

您忘记了在列表中收集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

注意,在本例中,您可以避免创建lamba,而使用方法引用.map(Optional::of)
我不明白为什么你会得到OptionalList,如果你事先知道列表中的元素是非空的,也许这只是为了练习Java 8,但正如@Eran所说,你应该使用Optional::ofNullable

s4n0splo

s4n0splo2#

看起来您忘记将流收集到列表:

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

但是应该使用ofNullable,因为of需要一个非空对象(当传递空引用时,它将抛出NullPointerException)。

相关问题