在流操作中使用方法引用和函数对象之间的区别?

2024-04-06

使用 Java 8 流时,我经常发现需要重构多语句 lambda 表达式。我将用一个简单的例子来说明这一点。假设我已经开始编写这段代码:

Stream.of(1, 3).map(i -> {
    if (i == 1) {
        return "I";
    } else if (i == 3) {
        return "E";
    }
    return "";
}).forEach(System.out::println);

现在我不太喜欢大的 lambda 表达式map称呼。因此,我想从那里重构它。我看到两个选项,要么我举个例子Function在我的课堂上:

private static Function<Integer, String> mapper = i -> {
    if (i == 1) {
        return "I";
    } else if (i == 3) {
        return "E";
    }
    return "";
};

并像这样使用它:

Stream.of(1, 3).map(mapper).forEach(System.out::println);

或者我简单地制定一个方法:

private static String map(Integer i) {
    if (i == 1) {
        return "I";
    } else if (i == 3) {
        return "E";
    }
    return "";
}

并使用方法参考:

Stream.of(1, 3).map(Test::map).forEach(System.out::println);

除了明显的品味问题之外,这两种方法还有什么优点或缺点吗?

例如,我知道堆栈跟踪在方法引用情况下变得更具可读性,这是一个小优势。


除非有一些我不知道的额外魔法,否则当前的 lambda 实现会将非捕获 lambda 脱糖为静态方法,并缓存 lambda 实例。通过明确地做同样的事情(astatic final对 lambda 的引用),您基本上是在重复该隐式工作,因此最终会得到对同一事物的两个缓存引用。您还击败了 lambda 实例的延迟初始化,否则您将免费获得该实例。

这就是为什么我更喜欢方法引用:它编写起来更简单,更惯用,而且在实现方面似乎更轻量级。

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

在流操作中使用方法引用和函数对象之间的区别? 的相关文章

随机推荐

  • 如何使用 Angular 在 vi​​s.js 中实现网络可视化?

    我已经通过以下方式安装了我需要的依赖项 vis js npm install vis save 类型 可见 npm install types vis save dev 代码片段 import Component AfterViewInit
  • invokedynamic 什么时候真正有用(除了惰性常量之外)?

    TL DR 请提供一段用一些众所周知的动态语言 例如 JavaScript 编写的代码 以及该代码在使用 invokedynamic 的 Java 字节码中的样子 并解释为什么使用 invokedynamic 是一个进步 背景 我在 goo
  • 如何对 axios 响应拦截器进行自定义错误代码检查?

    我在我的应用程序中使用 graphql 它错误地发送以下响应 您可能已经注意到 graphql 将所有错误作为状态代码 200 发送 我从 API 返回的错误位于data errors data errors message Error T
  • 剃刀组件中的 C# StateHasChanged() 不会强制

    我正在尝试服务器端 blazor 我正在尝试使用多个按钮设置 更改在剃刀组件的标签中播放的 mp4 文件 我发现实现这项工作的唯一方法是通过 IJSRuntime InvokeVoidAsync 从我的 razor 组件中的 OnParam
  • Webpack 图像文件夹

    我对 webpack 还很陌生 当我部署时我基本上得到了JS文件和一堆在同一文件夹中像这样乱码的图像 我愿意为此not即将发生 我想让图像文件保留它们的名称 因为在我的 javascript 中 我想动态加载图像文件以及资源文件中的其他内容
  • 在威特的最后...Javascript不会取代'\n'!

    我已经研究这个问题好几个小时了 但运气为零 不知道这怎么可能 我会尝试总结一下 我正在使用 TinyMCE 将新内容插入数据库 该内容在插入数据库后作为 AJAX 响应发送回 然后显示在页面上 替换一些旧内容 所有这些都与问题无关 据我所知
  • 如何在父 DIV 容器中移动 DIV 并调整其大小而不溢出?

    let isSelecting false let selectionStartX selectionStartY selectionEndX selectionEndY let selectionRectangle let dragged
  • iphone:(音频)发布消息以杀死 mediaserverd

    我正在使用以下方法播放几种声音 音频服务 https developer apple com library mac documentation AudioToolbox Reference SystemSoundServicesRefer
  • 如何在VB.net中读取PDF文件或在VB.net中将PDF转换为word文档

    我需要使用 VB net 编写的应用程序阅读 PDF 中的文本 目前最好的方法是什么 我也愿意先将 PDF 转换为 Word 文档 然后阅读 iTextPdf 看起来是一个很好的起点 开源和 C 所以任何示例都应该可以移植到 vb net
  • 如何以编程方式接收超过 10 条亚马逊 SQS 消息

    我们有 SQS 标准消息队列 并且它的增长速度非常快 大多数时候我们都会收到旧的通知 我们已将消息保留期配置为 2 天 有没有办法以编程方式接收超过 10 条消息 以下是我从亚马逊恢复 SQS 消息的代码 private IEnumerab
  • 反斜杠零分隔符 '\0'

    我见过 0 用作混合二进制文件 UTF8 字符串 二进制数据 中的分隔符 谁能解释一下什么 0 意味着或指向一个好的学习场所 这是空字符 更多信息请参见此维基百科article http en wikipedia org wiki Null
  • 重置页面上的所有复选框而不循环

    我想知道是否可以在不使用 jQuery 循环的情况下重置页面上的所有复选框 将它们标记为未选中 您可以使用单个选择器查找所有选中的复选框 并从中删除 checked 属性 jQuery 将通过循环在内部完成此操作 但您不必自己编写循环 ch
  • Javascript -Uncaught 承诺被拒绝,即使它已经被拒绝

    我正在运行这个 Parse com 云代码作业 它查询我的一个类并获取 url 然后我读取这些 url 它们是 xml 文件 然后从其中获取一些数据并将其保存以进行解析 从代码中可以看出 这是代码 完整代码在这里gist github co
  • 使用提交更新 docker 镜像并进行小的更改

    我想利用 Docker 镜像的缓存 分层来节省带宽 磁盘空间和时间 Let say 我安装了一个 Web 应用程序 docker 映像并将其部署到多个 docker 主机中 docker 镜像包含我的网络应用程序的源代码 我编写了代码 现在
  • 哈希表插入失败。负载系数太高。 - ASP.NET 4.0 MVC3

    我们有一个在 F5 负载平衡服务器上运行的 ASP NET 4 0 MVC3 应用程序 我们收到了下面的异常 我们不在 Web 应用程序中执行多线程 但不知道 F5 负载平衡服务器是否可以考虑到该等式中 我们看到早期版本的 NET 中发生异
  • 为什么 Java Map 对 get 和 remove 方法采用无类型参数?

    我在代码中遇到了一个错误 我使用了错误的密钥从 Java 映射中获取一些我认为是使用 Java 泛型强类型的内容 查看 Map Javadocs 时 许多方法 包括 get 和 remove 都采用对象作为参数 而不是类型 K 对于定义为
  • .net 消息循环

    谁能帮我解释一下如何与 WPF 中的消息循环交互 我知道如何开始使用 System Windows Threading Dispatcher Run 现在 我只需要一种调用它的方法 我有一个 while 循环 我想在消息循环中处理消息 wh
  • WordPress 5.2 YouTube 视频在帖子中自动嵌入功能不起作用

    在我的个人 WordPress 博客 5 2 中 视频自动嵌入功能不起作用 编辑器会显示一个微调框 非常简短 但随后它会在后端显示视频链接 并在前端以纯文本形式显示 URL 我尝试过在不同的浏览器中更改帖子 全部失败 我尝试了不同的视频 有
  • 声明和原型的区别

    C 中的声明和原型有什么区别 在哪些情况下它们被称为声明以及原型 TL DR 所有原型都是声明 但并非所有声明都是原型 宣言是标准中使用的通用术语 原型更具体 Quoting C11 第 6 7 章 声明指定一组标识符的解释和属性 并从 6
  • 在流操作中使用方法引用和函数对象之间的区别?

    使用 Java 8 流时 我经常发现需要重构多语句 lambda 表达式 我将用一个简单的例子来说明这一点 假设我已经开始编写这段代码 Stream of 1 3 map i gt if i 1 return I else if i 3 r