Java 8 流,为什么要编译第 2 部分...或者什么是方法引用,真的吗?

2024-04-08

好的,这个“系列”中的第一个问题是this one https://stackoverflow.com/questions/22561614/java-8-streams-min-and-max-why-does-this-compile.

现在,这是另一个案例:

Arrays.asList("hello", "world").stream().forEach(System.out::println);

这可以编译并运行...

好的,在最后一个问题中,来自 a 的静态方法class被使用。

但现在情况不同了:System.out is a static现场System, 是的;它也是一个PrintStream, and a PrintStream has a println()恰好与 a 的签名匹配的方法Consumer在这种情况下,并且a Consumer是什么forEach() expects http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#forEach-java.util.function.Consumer-.

所以我尝试了这个...

public final class Main
{
    public static void main(final String... args)
    {
        Arrays.asList(23, 2389, 19).stream().forEach(new Main()::meh);
    }

    // Matches the signature of a Consumer<? super Integer>...
    public void meh(final Integer ignored)
    {
        System.out.println("meh");
    }
}

它有效!

这是一个完全不同的范围,因为我启动了一个新实例,并且可以在构造该实例后立即使用方法引用!

那么,方法参考真的吗?any遵循签名的方法?有什么限制?是否存在可以构建“@FunctionalInterface 兼容”方法的情况cannot被用在一个@FunctionalInterface?


方法引用的语法定义在JLS #15.13 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13。特别地,它可以是以下形式:

Primary :: [TypeArguments] Identifier

Where Primary除其他外,可以是 http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-Primary a:

ClassInstanceCreationExpression

所以是的,你的语法是正确的。其他一些有趣的例子:

this::someInstanceMethod    // (...) -> this.someInstanceMethod(...)
"123"::equals               // (s) -> "123".equals(s)
(b ? "123" : "456")::equals // where b is a boolean
array[1]::length            // (String[] array) -> array[1].length()
String[]::new               // i -> new String[i]
a.b()::c                    // (...) -> a.b().c(...)

顺便说一句,既然您提到了静态方法,有趣的是您不能从实例创建静态方法引用:

class Static { static void m() {} }
Static s = new Static();

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

Java 8 流,为什么要编译第 2 部分...或者什么是方法引用,真的吗? 的相关文章

随机推荐

  • KnockoutJS - 打印迭代索引作为输入名称

    我正在尝试结合 Spring MVC 创建我的第一个 KnockoutJS 表单视图 ModelAttribute捆绑 数据通过 Ajax 加载并使用 KnockoutJS 填充 通过 KnockoutJS 添加数据 通过 Ajax 和 K
  • 如何在 Matplotlib 中的 x 轴上分配相等的缩放比例?

    我目前拥有的是这样的 x 3 0 4 0 5 0 5 0 6 0 7 0 9 0 9 0 9 0 11 0 y 6 0 5 0 4 0 2 5 3 0 2 0 1 0 2 0 2 5 2 5 生成以下图表 我想要的是在我的轴上具有相同的缩放
  • 错误:无法使用反射定义类

    我正在用这个制作应用程序webpage https hackernoon com a guide to tdd a react redux todolist app part 1 b8a200bb7091 我尝试测试 e2e tests 但
  • 有没有便宜或免费的 VB6 编程 IDE? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么 NSNumber 是不可变的?

    为什么 NSNumber 是不可变的 有充分的理由吗 因为现在我正在考虑创建自己的类只是为了可变性 一个数字是一个very基本数据类型 数字就是一个数字 如果你改变它 它就会变成别的东西 数字根本无法改变 与更复杂的数据相比 对象本身仍然代
  • WPF RadioButton InverseBooleanConverter 不工作

    我有两个 RadioButtons 我将它们绑定到 ViewModel 中的布尔属性 不幸的是 我在转换器中收到错误 因为 targetType 参数为空 现在我并不期望 targetType 参数为空 我期望 True 或 False 但
  • 仅将唯一项目添加到列表中

    当远程设备通过网络宣布自己时 我将其添加到列表中 我只想将之前未添加过的设备添加到列表中 这些公告是通过异步套接字侦听器发出的 因此添加设备的代码可以在多个线程上运行 我不确定我做错了什么 但无论我尝试什么 最终都会出现重复 这是我目前拥有
  • 开源项目如何实现有效的民主治理? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何成功实施民主 非BDFL http en wikipedia org wiki Benevolent Dictator For L
  • Node.JS PM2 内存泄漏

    我正在运行我的服务器pm2 start and pm2 monit正在向我展示3GB memory2个小时之后 所以我附加了memwatch 现在我又等了2个小时 再次显示内存pm2 monit到达3GB 因此 我检查了 memwatch
  • Gitlab - Xcode 无法连接远程存储库

    当我通过 Xcode 连接我的存储库时遇到问题 我在远程服务器上的 TurnkeyLinux 虚拟设备上安装了 Gitlab 版本 完全预装 在 Gitlab Web 界面中 我创建了一个新的测试用户 testuser 密码为 passwo
  • 通过“getDisplayMedia”检查浏览器/平台是否支持屏幕捕获

    我们可以通过以下方式请求媒体流到屏幕或窗口navigator mediaDevices getDisplayMedia 然而 这会立即提示用户决定使用哪种捕获 我需要检查浏览器 平台是否支持屏幕捕获 当然 也可以检查一下 getDispla
  • 如何判断时区是否在一年中的任何时间遵守夏令时?

    在 PHP 中 您可以使用如下方法判断给定日期是否在夏令时期间 isDST date I myDate 1 or 0 问题是 这只能告诉您该时间点是否处于夏令时 有没有可靠的方法来检查 DST 在该时区的任何时间是否生效 编辑以澄清 澳大利
  • 使用 Silverlight 的多个屏幕/监视器

    我想编写一个 Silverlight 应用程序 它有 2 个或更多可以 交互 的浏览器窗口 一个示例是父 详细信息显示 其中选择 父 列表 在一个浏览器窗口中 中的项目将在另一个窗口中显示该项目的详细信息 要点是 在多显示器设置中 用户可以
  • Django-manage.py sql APPNAME 不生成模型 SQL

    我正在开发一个相对较大的平面应用程序 为了保持关注点分离 我将模型和视图文件分成auth models dashboard models taxonomy models和更多 这些已放置在文件夹结构中 如下所示 APPNAME app mo
  • 为什么在循环外部和内部声明具有相同名称的变量不会产生错误?

    int i for i 0 i lt 5 i int i 10 printf d i 我有两个问题 为什么没有重新声明错误i 为什么输出会是105次和没有10 1 time 这一切都与scope的标识符 标识符只是 C 中赋予实体 对象 函
  • 单个 Blazor 项目可以同时包含 WebAssembly 部分和服务器端部分吗? [复制]

    这个问题在这里已经有答案了 现在 Blazor WebAssembly 已正式发布 我尝试使用该模板创建我的第一个 Blazor wasm 项目 但很快发现有一点与我的预期完全不同 模板中似乎没有 服务器 部分 并且发布的结果仅包含静态资产
  • 延迟 LINQ 查询执行实际上是如何工作的?

    最近我遇到这样的问题 What numbers will be printed considering the following code class Program static void Main string args int nu
  • ASP.Net Core MVC - 自定义属性的客户端验证

    在以前版本的 MVC 框架中 自定义验证将通过实现IClientValidatable和GetClientValidationRules method 然而在 ASP Net Core MVC 中 虽然我们确实有IClientModelVa
  • Pyramid 的 add_static_view 是如何工作的?

    Pyramid 中的 add static view name path 如何工作 从文档字符串 The name参数是一个表示应用程序相关的字符串 本地 URL 前缀 它也可以是完整的 URL 这path参数是静态文件在磁盘上的路径 居住
  • Java 8 流,为什么要编译第 2 部分...或者什么是方法引用,真的吗?

    好的 这个 系列 中的第一个问题是this one https stackoverflow com questions 22561614 java 8 streams min and max why does this compile 现在