Java 如何将列表转换为列表<;可选>;?

Java 如何将列表转换为列表<;可选>;?,java,java-8,optional,Java,Java 8,Optional,如何将列表转换为列表 以下代码生成编译错误: public Collection<Optional<UserMeal>> getAll() { Comparator comparator = new SortedByDate(); List<UserMeal> mealList = new ArrayList<>(repository.values()); Collections.sort(mealList,compara

如何将
列表
转换为
列表

以下代码生成编译错误:

public Collection<Optional<UserMeal>> getAll() {

    Comparator comparator = new SortedByDate();
    List<UserMeal> mealList = new ArrayList<>(repository.values());
    Collections.sort(mealList,comparator);
    Collections.reverse(mealList);

    **List<Optional<UserMeal>> resultList = Optional.of(mealList);**

    return resultList;
}
public Collection getAll(){
比较器比较器=新的SortedByDate();
List-mealList=newarraylist(repository.values());
集合。排序(mealList、comparator);
收藏。反面(米利斯特);
**列表结果列表=可选的.of(mealList)**
返回结果列表;
}
可选。of(mealList)
返回一个
可选的
,而不是
列表

要获得所需的
列表
,您应该用
可选的
包装
列表的每个元素:

List<Optional<UserMeal>> resultList = 
    mealList.stream()
            .map(Optional::ofNullable)
            .collect(Collectors.toList());
列表结果列表=
mealList.stream()
.map(可选::of nullable)
.collect(Collectors.toList());

注意:我使用了
Optional::of nullable
而不是
Optional::of
,因为如果您的输入
List
包含任何空元素,后者将生成
null点异常


可选。ofNullable(mealList)

考虑看一看,例如,您的问题和您的代码询问了两个不同的问题。你的标题和正文说你想要一个
可选的
,但是你的代码使用了一个
列表
,就是这样吗?一般代码审查评论:1)不要使用原始的
比较器
。您可能需要
比较器
。2) 使用
comparator.reversed()
反转比较器,而不是排序和反转。3) 有一个
列表是很奇怪的。在列表中间有一个空的可选项意味着什么?由于列表已经排序,它不再按索引与任何其他数据结构相关联。也许这里需要重新考虑对象建模。另一方面,如果您想要
可选的
,那么通常最好只是有一个空列表而不是可选列表。例如,您可以无条件地对空列表和非空列表进行循环或流式处理,而无需解压缩可选列表等。您应该认真考虑是否要返回类似集合的内容。如果打算在集合中允许NULL值,我会考虑在返回集合之前过滤掉它们。如果您的列表中包含null元素,为什么不需要一个<代码> Null PoExtExeals< /Cuth>?@ Louis Wasserman:如果您通过异常整理出<代码> null < /Case>元素,为什么要使用<代码>列表>代码>?并不是说使用类似于
List
的东西是推荐的编码风格…