以下代码将对象列表转换为可选对象列表。使用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类。
答案 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
Optional
。Optional::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
。)