在Java 8中是否有更优雅的方法实现这一目标?
list.stream()
.map(e -> myclass.returnsOptional(e))
.filter(Optional::isPresent)
.map(Optional::get)
.collect(Collectors.toList());
我说的是filter(Optional::isPresent)
后跟map(Optional::get)
,我想优先收集列表中Optional
个有价值的结果。
答案 0 :(得分:1)
在您的情况下,您可以使用一个flatMap
而不是map
filter
和map
的组合。
要做到这一点,最好定义一个单独的函数来创建Stream:public private static Stream<Integer> createStream(String e)
在lambda表达式中没有几行代码。
请参阅我的完整演示示例:
public class Demo{
public static void main(String[] args) {
List<String> list = Arrays.asList("1", "2", "Hi Stack!", "not", "5");
List<Integer> newList = list.stream()
.flatMap(Demo::createStream)
.collect(Collectors.toList());
System.out.println(newList);
}
public static Stream<Integer> createStream(String e) {
Optional<Integer> opt = MyClass.returnsOptional(e);
return opt.isPresent() ? Stream.of(opt.get()) : Stream.empty();
}
}
class MyClass {
public static Optional<Integer> returnsOptional(String e) {
try {
return Optional.of(Integer.valueOf(e));
} catch (NumberFormatException ex) {
return Optional.empty();
}
}
}
如果returnOptional不能是静态的,你需要使用&#34; arrow&#34;表达而不是&#34;方法参考&#34;
答案 1 :(得分:-1)
不确定它是否如此不同但您可以根据您的可选项进行过滤,而不是获取可选项并进行下一步过滤。 像这样的东西?
list.stream()
.filter(e -> myclass.returnsOptional(e).isPresent())
.collect(Collectors.toList());
注意:这仅在returnOptional返回与原始列表项类型相同的对象类型时才有效。