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
的东西是推荐的编码风格…