Java 8 流和映射值得吗?

2023-12-26

感觉 java 8 流和映射函数是如此冗长,它们并不是真正的改进。例如,我编写了一些使用集合生成另一个经过修改的集合的代码:

private List<DartField> getDartFields(Class<?> model) {
    List<DartField> fields = new ArrayList<>();
    for (Field field : model.getDeclaredFields()) {
        if (!Modifier.isStatic(field.getModifiers())) {
            fields.add(DartField.getDartField(field));
        }
    }
    return fields;
}

这似乎是 java 8 流及其函数的理想用例,所以我这样重写了它:

private List<DartField> getDartFields(Class<?> model) {
    return Arrays.asList(model.getDeclaredFields())
            .stream()
            .filter(field -> !Modifier.isStatic(field.getModifiers()))
            .map(field -> DartField.getDartField(field))
            .collect(Collectors.toList());
}

但我不确定我更喜欢那个。它有 236 个字符,而普通风格的 java 中有 239 个字符。它似乎没有或多或少的可读性。很高兴您不必声明ArrayList,但需要打电话.collect(Collectors.toList()) and Arrays.asList(取决于数据类型)也好不到哪去。

使用方面是否有一些实际的改进.stream()像这样我就是不明白,或者这只是一种有趣的方式让那些不懂函数式编程的同事陷入困境?

我想如果我动态地传递过滤器或映射 lambdas 它会很有用,但如果你不需要这样做......


问题是你没有使用Stream API 始终如一地。您将用例限制为可以最好地描述为“实际上不使用StreamAPI”,因为您坚持返回Collection。这尤其荒谬,因为它是private方法,这样您也完全能够适应调用者。

考虑将方法更改为

private Stream<DartField> getDartFields(Class<?> model) {
    return Stream.of(model.getDeclaredFields())
            .filter(field -> !Modifier.isStatic(field.getModifiers()))
            .map(field -> DartField.getDartField(field));
}

看看是什么来电者其实想做。通常他们不需要Collection作为目的本身,但想要执行一个动作甚至更多可以链接的操作,例如打印它们:

getDartFields(Foo.class).forEach(System.out::println);

最有趣的特征是流的惰性本质,这意味着getDartFields返回,尚未执行任何操作,如果您使用类似的操作findFirst,不需要处理所有元素。如果您退回,您将失去此功能Collection包含所有元素。

这也适用于多步骤处理,其中处理普通列表意味着必须为每个步骤创建一个新列表并用结果填充。

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

Java 8 流和映射值得吗? 的相关文章

随机推荐

  • 动态修改页面内容的 IE7 相对/绝对定位错误

    我想知道是否有人知道如何解决 IE7 中的以下问题
  • 在 Mac 上将 .xls 和 .xlsx 批量转换为 .txt(制表符分隔)

    我有大约 150 个 xls 和 xlsx 文件需要转换为制表符分隔 我尝试使用 automator 但只能一一完成 不过 这绝对比单独打开每个文件要快 我的脚本知识很少 所以我希望有一种尽可能轻松地完成此操作的方法 如果您准备使用 Pyt
  • Pywinauto type_keys() 省略字符串中的“%”

    当尝试输入字符串时 customer asked for 30 discount 通过使用到一个表单type keys 在 Pywinauto 0 6 5 中 它发送的输出是 customer asked for 30 discount 省
  • 有关在我的计算机中安装 PCL 的问题

    当我尝试安装 python pcl PCL 是用于像激光雷达数据一样演示的点云库 我按照上的说明进行操作https github com strawlab python pcl https github com strawlab pytho
  • 如何使用 Google Mock 模拟模板方法?

    我正在尝试模拟模板方法 这是包含要模拟的方法的类 class myClass public virtual myClass template
  • clang++:错误:链接器命令失败,退出代码 1 Qt Android

    无法构建 Qt 示例 在 Windows 中构建时出现错误 E android ndk r20 windows x86 64 android ndk r20 toolchains aarch64 linux android 4 9 preb
  • 动态端口和 AWS 应用程序负载均衡器和 ECS

    ELB 后面的 Docker 容器获取自动注册到 ELB 的动态端口 以便它们可以将流量重定向到它们 为了使 ELB 可以访问您的 Web 服务器 您必须打开来自安全组内的所有这些端口 1024 65535 有没有办法不必向一系列端口开放安
  • fpdf - 返回上一页

    我正在使用 fpdf 生成 pdf 发票 有些发票包含很多项目 详细信息需要进入第二页 但是 我需要在第一页上显示总数和其他详细信息 现在 如果我可以添加这样的新页面 pdf gt AddPage 但是 这会将所有内容放入第二页 无论此声明
  • 如何保护应用程序池免受会话序列化异常的影响?

    我们正在使用进程外会话提供程序 ScaleOut 对于 ASP NET 应用程序 我们注意到when未正确设置反序列化的对象会无意中进入会话最终导致整个进程终止 重现和处理这个场景是更有趣的地方 终止进程的异常是在会话状态中的任何 StaO
  • ruby Enumerable#first 与 #take

    ruby 枚举 数组有什么区别first n and take n 我依稀记得take与惰性评估有关 但我不知道如何使用它来做到这一点 并且在谷歌搜索或文档中找不到任何有用的东西 take 是一个很难通过谷歌搜索的方法名称 first n
  • tf.gradients 如何管理复杂的函数?

    我正在研究复值神经网络 对于复值神经网络 通常使用 Wirtinger 微积分 那么导数的定义是 考虑到由于刘维尔定理 函数是非全纯的 如果你看广濑彰的书 复值神经网络 进展与应用 第 4 章方程 4 9 定义 当然 偏导数也是使用维廷格微
  • WooCommerce - 为某些特定用户角色启用“零税率”税级

    在 wy WooCommerce 网站中 我将销售给经销商 AND 经销商 问题是经销商免税 因此我需要一个自定义函数来为某些客户角色启用零税率 如果 WooCommerce 自己做到这一点 那将是最佳选择 但事实并非如此 所以我的问题是
  • 如何获取大页面大小的值?

    我希望直接从我的 C 代码中获取大页面大小的值 而无需运行 bash 命令 从 bash 我可以做到这一点 grep pse proc cpuinfo gt dev null echo 2M huge page size are suppo
  • 有谷歌云存储模拟器吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 出于测试目的 我想模拟 Cloud Storage 因为它会减慢测试速度 有谷歌云存储模拟器吗 谷歌有
  • 如何将视图绑定与包含的视图一起使用?

    View Binding 在 v3 6 中发布 Docs https developer android com topic libraries view binding https developer android com topic
  • QWidget / X11:防止通过鼠标单击激活/聚焦窗口

    我想用 Qt QML 开发一个系统范围的屏幕键盘 通过 xlib 注入按键事件效果很好 我现在的问题 如果单击键盘按钮 具有所选输入字段的窗口将失去焦点 因此 按键事件将不会传递到先前选择的输入字段 那么有人知道如何防止 QWidget 被
  • 待办事项列表项文本与以下列表项的文本重叠

    我使用 jQuery 和 Bootstrap 创建了一个待办事项列表 如果您在列表容器中输入的文本长度超过单行 则第一行中不适合的内容将与下一行中的现有列表项文本重叠 这是我的 CSSul and li元素 视图CodePen https
  • 如何处理要求使用 Ansible 任务输入的命令?

    我正在学习 Ansible 我想知道如何编写一个任务来处理以下命令
  • readdir() 32/64 兼容性问题

    我正在尝试让一些旧的遗留代码在新的 64 位系统上运行 但目前陷入困境 下面是一个小 C 文件 我用它来测试当前正在中断的实际程序中存在的功能 define POSIX SOURCE include
  • Java 8 流和映射值得吗?

    感觉 java 8 流和映射函数是如此冗长 它们并不是真正的改进 例如 我编写了一些使用集合生成另一个经过修改的集合的代码 private List