微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在Java 8流API中定义可选流或类似异常的行为?

让我们得到一系列对象,这些对象是由一系列操作产生的(例如映射,过滤,平面映射等).现在我想对它们执行某个操作,但仅当给定的谓词为真时.否则我想立即返回别的东西.

一个简单的例子.我有一堆不同的食物.如果所有这些都可以食用,我想对它们进行烹饪操作并返回熟食清单.但如果其中任何一个结果不可食用,我想立即返回一个空列表.

我想到的解决方案很少,但我对它们中的任何一个都不满意.

我可以首先在流上使用isEdible谓词执行allMatch操作,但是它将导致终止它,我需要再次重复初步操作.

在检查可编辑性之前,我可以保留作为初步操作结果的集合,但因此我需要为所有元素执行它们.这是不理想的,因为它可能会变成,第一个不可食用,而allMatch会更早地返回.

或者我可以设计一个hacky reduce例程,但是当谓词失败时它也无法停止处理元素.

我希望的是类似下面的代码.目前的API有可能吗?

source.stream()
    // some operations
    .ifAny(food -> !food.isEdible(),new LinkedListIoUs step not Failed
    .peek(food -> food.prepare())
    .collect(Collectors.toList());
最佳答案
不完全是您想要的,但使用三元运算符将使您的两步解决方案看起来更干净,它也应该具有最佳性能

return source.stream()
    .allMatch(this::isEdible)
    ? source.stream()
        .map(this::prepare()) // do stuff
        .collect(Collectors.toList())
    : Collections.emptyList();

原文地址:https://www.jb51.cc/java/437332.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐