Java 8 collect() only isPresent() Optional values

2022-09-03 08:08:03

有没有一种更优雅的方法可以在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


答案 1

在您的情况下,您可以使用一个而不是和的组合。为此,最好定义一个单独的函数来创建 Stream:在 lambda 表达式中没有几行代码。flatMapmapfiltermappublic 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”表达式而不是“方法引用”


答案 2

不确定它是否如此不同,但您可以根据可选内容进行筛选,而不是获取可选内容并接下来进行筛选。像这样的东西?

list.stream()
    .filter(e -> myclass.returnsOptional(e).isPresent())
    .collect(Collectors.toList());

注意:仅当 returnsOptional 返回与原始列表项类型相同的对象类型时,这才有效。


推荐