【发布时间】:2018-12-16 04:52:27
【问题描述】:
我需要从List<Optional<String>> 中删除所有空/空值。
例子:
List<Optional<String>> list = new ArrayList<>();
list.add(Optional.empty());
list.add(Optional.of("Str1"));
list.add(Optional.of("Str2"));
list.add(Optional.of("Str3"));
list.add(Optional.of("Str4"));
list.add(Optional.of("Str5"));
list.add(Optional.empty());
list.add(Optional.ofNullable(null));
目前,我正在使用以下方法之一:
方式一:
List<String> collect = list.stream()
.filter(Optional::isPresent)
.map(obj ->obj.get())
.collect(Collectors.toList());
方式二:
List<Optional<String>> emptlist = new ArrayList<>();
emptlist.add(Optional.empty());
list.removeAll(emptlist);
还有其他更好的方法吗?
【问题讨论】:
-
您是要创建列表的过滤副本并将可选项转换为字符串,还是要从列表中删除空元素?选项 1 是前者,选项 2 是后者。所以他们根本不做同样的事情。如果是后者,使用 removeIf() 会更清晰。
-
到底是什么问题?但是使用
Collection.removeIf。就像list.removeIf(o -> !o.isPresent()); -
您的编辑并没有真正帮助(我之前能够阅读),您仍然不清楚,首先您要求“从
List<Optional<String>>.中删除所有空/空值”然后您在 cmets 中说“-需要过滤列表的单独副本”。那么它是什么?请提供minimal reproducible example 解释您的期望。 -
见Filtering a Stream of Optionals in Java。此外,IMO 第一种方法与使用 java-8 一样干净,尽管您可以使用
map(Optional::get)而不是map(obj ->obj.get())。
标签: java java-8 java-stream java-9