没有元素时流的特殊行为

2024-01-08

我如何用 java 8 Streams-API 表达这一点?

我想表演itemConsumer对于流的每个项目。如果有 没有我想要执行的项目emptyAction.

当然我可以写这样的东西:

Consumer<Object> itemConsumer = System.out::println;
Runnable emptyAction = () -> {System.out.println("no elements");};

Stream<Object> stream = Stream.of("a","b"); // or Stream.empty()
List<Object> list = stream.collect(Collectors.toList());
if (list.isEmpty())
    emptyAction.run();
else
    list.stream().forEach(itemConsumer);

但我宁愿避免任何Lists.

我还考虑过在 a 中设置一个标志peek方法 - 但该标志将是非最终的,因此不允许。使用布尔容器似乎也是一种太多的解决方法。


你可以强迫reduce去做这个。逻辑是减少false,将值设置为true如果遇到任何有用的数据。

的结果是reduce那么就是false那么没有遇到任何项目。如果遇到任何项目,那么结果将是true:

boolean hasItems = stream.reduce(false, (o, i) -> {
    itemConsumer.accept(i);
    return true;
}, (l, r) -> l | r);
if (!hasItems) {
    emptyAction.run();
}

这对于并行流来说应该可以正常工作,因为任何遇到项目的流都会将该值设置为true.

然而,我不确定我是否喜欢这个,因为它的使用有点迟钝reduce手术。

另一种选择是使用AtomicBoolean作为一个可变的boolean容器:

final AtomicBoolean hasItems = new AtomicBoolean(false);
stream.forEach(i -> {
    itemConsumer.accept(i);
    hasItems.set(true);
});
if (!hasItems.get()) {
    emptyAction.run();
}

但我不知道我是否或多或少喜欢这样。

最后,你可以拥有你的itemConsumer记住状态:

class ItemConsumer implements Consumer<Object> {

    private volatile boolean hasConsumedAny;

    @Override
    public void accept(Object o) {
        hasConsumedAny = true;
        //magic magic
    }

    public boolean isHasConsumedAny() {
        return hasConsumedAny;
    }
}

final ItemConsumer itemConsumer = new ItemConsumer();
stream.forEach(itemConsumer::accept);
if (!itemConsumer.isHasConsumedAny()) {
    emptyAction.run();
}

这看起来更简洁,但可能不实用。所以也许是一个装饰器模式 -

class ItemConsumer<T> implements Consumer<T> {

    private volatile boolean hasConsumedAny;
    private final Consumer<T> delegate;

    ItemConsumer(final Consumer<T> delegate) {
        this.delegate = delegate;
    }

    @Override
    public void accept(T t) {
        hasConsumedAny = true;
        delegate.accept(t);
    }

    public boolean isHasConsumedAny() {
        return hasConsumedAny;
    }
}

final ItemConsumer<Object> consumer = new ItemConsumer<Object>(() -> /** magic **/);

TL;DR: 某物一定要记住你在消费过程中是否遇到过什么事情Stream, be it:

  • the Stream本身的情况下reduce;
  • AtomicBoolean; or
  • 消费者

我认为从逻辑的角度来看,消费者可能处于最佳位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有元素时流的特殊行为 的相关文章

随机推荐

  • 如何解决Oracle weblogic服务器中的SplitsrcTargetPreparation异常?

    I am trying to run a simple Restful web service example on oracle weblogic server but i am getting this issue while run
  • 我如何打开 zip 文件中的文件而不用 PHP 解压它

    我只是想制作一个可以打开 zip 存档中的文件的系统 就像我有 archive zip 在这个文件中 text 我想创建一个类来标记此页面 zip php archiver archive zip file file text 我希望此页面
  • 如何可视化或绘制多维张量?

    我想知道这里是否有人尝试过在 numpy 中可视化多维张量 如果是这样 您能与我分享一下我该怎么做吗 我正在考虑将其简化为二维可视化 我已经包含了一些示例输出 它的结构很奇怪 有省略号 并且有一个 4D 张量布局 内容在这里 样本数据 9
  • 使用 C,尽可能干净地将动态分配的 int 数组转换为逗号分隔的字符串

    我在 C 方面的经验比在高级语言方面的经验要少得多 在思科 我们使用 C 我有时会遇到一些在 Java 或 Python 中很容易做到 但在 C 中很难做到的事情 现在就是这样的时候之一 我有一个动态分配的无符号整数数组 我需要将其转换为逗
  • 蒙皮网格着色器的统一顶点位移(动画轮廓,Three.js)

    我想我已经解决了在 Three js 中渲染网格上的边框 轮廓的实现 这是许多游戏用于突出显示对象 角色的技术 Diablo 1 and 3 for example 这是详细信息 https stackoverflow com questi
  • 您不知道已安装发电机

    我刚刚安装了 Yeoman 和一些发电机 然而 由于 usr lib文件夹受到保护 我选择更改 NPM 安装其软件包的位置的前缀 现在 一切都在安装 node 我也改变了我的 PATH并添加了 node bin 但是 当我执行yo
  • 更改 JTextArea 中特定行的字体

    您好 我正在开发一个聊天应用程序 我希望用户可以更改他 她正在编写的字体 有一个setFont 函数 但它更改了 TextArea 中所有字符串的字体 所以我只想更改我的字体 如果您能帮助我 我将不胜感激 那么我想我必须学一点 HTML 我
  • 以编程方式创建Windows用户c#.net(使用PricinpalUser / CreateProfile)

    简而言之 我想做的是创建一个能够登录的新用户 我从各种来源提取了代码 并尝试简化它 然而 我遇到了一些绊脚石 当我打电话时UserPrincipal Save 它给了我一个错误 在缓存中找不到目录属性 异常类型 COMExceptioncr
  • 在 Visual Studio 设计器中隐藏 WPF 元素

    我有一个 WPF 表单 基本上如下所示
  • 如何设置 Android 操作栏上菜单项的样式

    关于操作栏样式的问题有很多 但我发现的问题要么与选项卡样式有关 要么有不适合我的答案 问题其实很简单 我希望能够更改操作栏中菜单项的文本样式 甚至只是颜色 我读过这个 还有这个问题 Android Honeycomb 中的操作栏样式 htt
  • 如何使用机器人框架和 selenium 读取 Web 控制台输出?

    我正在尝试读取网页的控制台输出 特别是我需要使用 RF 和 Selenium 进行 POST GET PUT ajax 调用 我在网上找到了一些帮助 但似乎无法使其发挥作用 我的Python脚本是 from selenium webdriv
  • 如何动态设置 EditText 高度

    我想简单地将 EditText 组件的高度设置为用户屏幕高度的 50 我正在从 xml 文件 main xml 创建初始布局 该文件加载到 Activity 的 onCreate Bundle 中 从 xml 配置中 我了解如何将 Edit
  • IronPython Web 框架

    Python 似乎有很多优秀的 Web 框架 有人在 IronPython 中使用过这些 Pylons Web2Py Django 吗 Django 已在 IronPython 上运行 http unbracketed org 2008 m
  • 依赖类型:依赖对类型与不相交联合有何相似之处?

    我一直在研究依赖类型 我了解以下内容 Why 通用量化 https en wikipedia org wiki Universal quantification被表示为依赖函数类型 x A B x means 对全部x类型的A有一个类型的值
  • C# Windows 窗体用户控件控件设计器支持

    我正在寻找的是对用户控件内的控件的相同类型的设计器支持 即 调整用户控件内的文本框大小 移动标签将用户控件放置到表单上之后 我能做的事 创建一个用户控件 使用设计器向其添加控件 创建一个新的窗口窗体应用程序 将用户控件添加到工具箱 将控件拖
  • JQuery 在该位置插入表格行

    我一直在研究一种能够向 html 表插入行的解决方案 这非常棘手 我发现了一些有用的东西 但仅适用于第一个 插入 我不知道我做错了什么 我有一个包含 3 列的基本表格 每个表格都有一个按钮 允许在两行之间插入一行 我在这个网站上搜索了一个解
  • 如何让 .env 预提交 + mypy + django-stubs

    我尝试在提交之前配置启动 mypy django stubs 检查 我使用预提交 当我尝试提交时 出现错误django core exceptions ImproperlyConfigured 设置 POSTGRES DB 环境变量 该变量
  • java.sql 中的日期时间等效项? (有 java.sql.datetime 吗?)

    到目前为止 我还没有找到明确的答案 我想知道使用PreparedStatement 的SQL 类型DATETIME 和java 类型的等价物是什么 我已经发现 http www java2s com Code Java Database S
  • Shell 脚本中的 exec ${PERL-perl} -Sx $0 ${1+"$@"} 是什么意思?

    我的任务是将包含 Shell 脚本 Perl 代码的 shell 脚本转换为 Python 我设法将 Perl 代码转换为 Python 但是有这个shell脚本语句我不明白 usr bin sh exec PERL perl Sx 0 1
  • 没有元素时流的特殊行为

    我如何用 java 8 Streams API 表达这一点 我想表演itemConsumer对于流的每个项目 如果有 没有我想要执行的项目emptyAction 当然我可以写这样的东西 Consumer itemConsumer Syste