使用 Java 8 Stream 的构建器模式

2024-05-04

我正在用一个简单的循环构建一个对象:

WebTarget target = getClient().target(u);

for (Entry<String, String> queryParam : queryParams.entrySet()) {
    target = target.queryParam(queryParam.getKey(), queryParam.getValue());
}

我想使用 Java8 Stream API 做同样的事情,但我不知道如何做。让我挣扎的是每次都会重新分配目标,因此简单的 .forEach() 将不起作用。我想我需要使用 .collect() 或 reduce() 因为我正在寻找单个返回值,但我现在迷失了!


实施正确的方法并不困难foldLeft对于 Java 8 流:

@SuppressWarnings("unchecked")
public static <T, U> U foldLeft(Stream<T> stream, 
                                U identity, BiFunction<U, ? super T, U> accumulator) {
    Object[] result = new Object[] { identity };
    stream.forEachOrdered(t -> result[0] = accumulator.apply((U) result[0], t));
    return (U) result[0];
}

或者以类型安全的方式:

public static <T, U> U foldLeft(Stream<T> stream, 
                                U identity, BiFunction<U, ? super T, U> accumulator) {
    class Box {
        U value;
        Box(U value) { this.value = value; }
    }
    Box result = new Box(identity);
    stream.forEachOrdered(t -> result.value = accumulator.apply(result.value, t));
    return result.value;
}

这适用于顺序流和并行流。如果您的流具有一些消耗 CPU 的无状态中间操作,例如map:在这种情况下,可以通过以下方式处理下一个元素map与当前元素并行处理foldLeft。我不同意这样的操作不适合Stream API,因为它可以通过已经存在的正确表达forEachOrdered.

我有这个操作StreamEx https://github.com/amaembo/streamex库,所以你可以像这样使用它:

WebTarget target = EntryStream.of(queryParams).foldLeft(getClient().target(u), 
        (t, entry) -> t.queryParam(entry.getKey(), entry.getValue()))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 8 Stream 的构建器模式 的相关文章

随机推荐

  • ruby-on-rails 检查查询结果是否为空(Model.find)

    我正在 Rails 上使用 ruby 并尝试检查查询是否返回值 这是查询 search Customer find by name login name 如果查询找到结果 一切都很好 但是我如何对空结果做出反应 I tried if sea
  • 多个域到单个网站

    我有多个域指向同一个网站 FFFF com FFFF ca FFFF org 等 重写 FFFF com 所有传入流量的最佳方法是什么 URL 重写还是 301 寻找最佳实践 这两个将在 htaccess 中处理 对吧 Thanks 在这种
  • PHP 设计模式

    好的 我想首先让您注意到我一直在寻找 php mvc 设计模式 所以我还没有真正找到我想要的东西 现在 在写我的问题时 我找不到我要问的任何相关且具体的问题 但我知道我可能是错的 无论如何考虑这个问题和一个可能有用的问题包 Question
  • 为什么从 Evaluate 调用时 VBA Find 循环失败?

    当使用 Application Evaluate 或 ActiveSheet Evaluate 方法调用例程时 我在子例程内运行查找循环时遇到一些问题 例如 在下面的代码中 我定义了一个子例程 FindSub 它在工作表中搜索字符串 xxx
  • 指向成员函数的指针与指向数据成员的指针有何不同?

    所以我有这个别名模板 template
  • 找不到 java.lang.Object 的类文件

    我重新安装了我的日食 然后在Eclipse中导入所有项目 但是每个项目都有一个常见的错误 Cannot find the class file for java lang Object at Line 1 我检查了我的 Java 路径 但无
  • MATLAB 在 MATLAB 7.10.0 学生版中似乎找不到 csaps()

    我有一些代码使用csaps Matlab的三次平滑样条拟合函数 http www mathworks com help toolbox curvefit csaps html我想将其提供给使用 MATLAB 7 10 0 R2010a 的学
  • 如何在没有 Web 服务器的情况下运行 ajax 代码?

    我在系统上没有服务器的情况下运行ajax 我用它创建了一个index html JavaScript 函数 function do the click url alert inside this method do the click aj
  • Python 中快速、小型且重复的矩阵乘法

    我正在寻找一种使用 Python Cython Numpy 快速将许多 4x4 矩阵相乘的方法 任何人都可以给出任何建议吗 为了展示我当前的尝试 我有一个需要计算的算法 A 1 A 2 A 3 A N 哪里每个 A i A j Python
  • 使用 spacy.matcher.matcher.Matcher.add() 方法的问题

    我在尝试使用 spacy 时遇到错误matcher Anaconda3 lib site packages spacy matcher matcher pyx in spacy matcher matcher Matcher add Typ
  • python 使用 shapefile 掩码 netcdf 数据

    我正在使用以下软件包 import pandas as pd import numpy as np import xarray as xr import geopandas as gpd 我有以下存储数据的对象 print precip d
  • 在 Python、Django 中下载的文件始终为空

    我在 Django 中使用以下视图来创建文件并使浏览器下载它 def aux pizarra request myfile StringIO StringIO myfile write hello response HttpResponse
  • SignalR 无法连接到 SSL 上的 Azure Redis

    我目前在 Azure 上托管我的 redis 缓存服务器 并让 signalR 依赖它作为骨干 使用以下内容 GlobalHost DependencyResolver UseRedis 服务器 端口 密码 eventKey 这可以在端口
  • 如何禁止在应用程序启动时创建空日志文件?

    我已经在我的应用程序中成功配置了 log4net 但有一件事对我来说有点烦人 即使没有发生错误 日志文件也会在我的应用程序启动后创建 空 我想仅在出现错误后才创建日志文件 我实际上在这个线程中找到了一种方法来做到这一点 http www l
  • rpart 绘图文本较短

    我正在使用prp函数从rpart plot包来绘制一棵树 对于像状态这样的分类数据 它给出了一个非常长的变量列表 并且使其可读性较差 如果超过一定长度 有什么方法可以将文本换行为两行或更多行吗 这是一个将长分割标签包装在多个标签上的示例 线
  • 更新通过 JungleDisk 上传的 Amazon S3 文件的权限

    我开始使用 Jungle Disk 将文件上传到与 Cloudfront 发行版相对应的 Amazon S3 存储桶 即我可以通过 http URL 访问它 并且我使用 Amazon 作为 CDN 我面临的问题是 Jungle Disk 没
  • 快速NLTK解析成语法树

    我正在尝试将数百个句子解析为语法树 我需要快速完成 问题是如果我使用 NLTK 那么我需要定义一个语法 而我不知道我只知道它会是英语 我尝试使用this https github com emilmont pyStatParser统计解析器
  • Visual Studio 中的 C 编程

    我可以使用 Visual Studio 来学习 C 编程吗 在新项目菜单中 我可以在 Visual Basic Visual C Visual C Visual F 等之间进行选择 但我没有看到 C 或 Visual C 简短回答 是的 您
  • IE 抛出 JavaScript TypeError 但在 chrome 上不抛出

    描述在我们的 Magento 购物车上 当用户单击添加到购物篮在任何 Internet Explorer 浏览器的 产品详细信息 页面上单击按钮 浏览器中都会弹出一个包含以下错误消息的窗口 异常 类型错误 无法获取未定义或空引用的属性 ta
  • 使用 Java 8 Stream 的构建器模式

    我正在用一个简单的循环构建一个对象 WebTarget target getClient target u for Entry