在您的情况下,您可以使用一个而不是和的组合。为此,最好定义一个单独的函数来创建 Stream:在 lambda 表达式中没有几行代码。flatMap
map
filter
map
public private static Stream<Integer> createStream(String e)
请参阅我的完整演示示例:
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();
}
}
}
如果返回选项不能是静态的,您将需要使用“arrow”表达式而不是“方法引用”