当前位置: 首页 > 面试题库 >

Java中String方法的函数指针

尚阳炎
2023-03-14
问题内容

我对lambda不太了解。

String s = "Hello World";       
Function<Integer, String> f = s::substring;
s = null;
System.out.println(f.apply(5));

如果,为什么该f.apply方法仍然有效s = null。毕竟,该String对象应该由GC删除,因为没有指向该对象的指针。

还有一件事,为什么我在这里不需要返回声明?

Function<Integer, String> f = t -> t + "";

问题答案:

在JLS,第15.13.3描述方法引用的运行评估。

方法参考表达式评估的时间比lambda表达式(第15.27.4节)更复杂。
当方法引用表达式的::分隔符之前具有表达式(而不是类型)时,将立即对该子表达式求值。该 评价的结果被存储,直到相对应的功能的接口类型的方法被调用;
此时,结果将用作调用的目标参考
。这意味着::分隔符之前的表达式仅在程序遇到方法引用表达式时才被评估,并且不会在后续对功能接口类型的调用时被重新评估。

(加粗强调我的)

基本上s,将对方法引用的引用存储为以后执行。在这里,字符串"Hello World"被保存以供以后执行方法引用。因此,即使在方法引用的声明之后设置snull,但在执行之前设置为Function,它仍将使用字符串"Hello World"

设置为null不能保证垃圾收集器会收集它,也不能保证立即收集垃圾。

另外,在这里,方法参考中仍然有一个参考,因此这里根本不会收集垃圾。

最后,lambda表达式主体具有2种形式:一个表达式和一个语句块(可能带有return语句)。用

Function<Integer, String> f = t -> t + "";

那是一种表达。等效的block语句为:

Function<Integer, String> f = t -> { return t + "";};


 类似资料:
  • 问题内容: 这可能是普通且琐碎的事情,但我似乎在寻找具体答案时遇到了麻烦。在C#中,有一个委托的概念,它与C ++中的函数指针紧密相关。Java中是否有类似的功能?考虑到指针的缺失,最好的方法是什么?需要明确的是,我们在这里谈论头等舱。 问题答案: 类似函数指针的功能的Java习惯用法是实现接口的匿名类,例如 更新:在Java 8之前的Java版本中,以上是必要的。现在,我们有更好的替代方法,即l

  • 问题内容: 我已经阅读了这个问题,但是我仍然不确定是否可以在Java中将指向方法的指针保留在Java数组中,如果有人知道这样做是否可行,那将是真正的帮助。我正在尝试找到一种优雅的解决方案,在不编写成百上千个“ if”的情况下保留字符串列表和相关函数。 干杯 问题答案: Java本身没有函数指针(或C#说法中的“委托”)。这种事情往往是用匿名子类来完成的。

  • 问题内容: 我读过一些文章和书籍,几乎总是避免使用它。我知道为什么会这样,但是使用String(String)构造函数有什么用吗?我不认为有,也没有其他证据,但是我想知道SO社区中的任何人是否知道使用。 问题答案: 这是一篇很好的文章:认为无用的String构造函数毕竟是有用的! 事实证明,在至少一种情况下,此构造函数实际上可以有用。如果您曾经看过String源代码,就会发现它不仅包含用于char

  • 问题内容: 对于我的Java游戏服务器,我发送数据包的操作ID,该操作ID基本上告诉服务器该数据包的用途。我想将每个动作ID(一个整数)映射到一个函数。有没有不用开关就可以做到这一点的方法? 问题答案: 这个如何? (如果需要传递一些参数,请使用具有合适参数的函数定义自己的接口,并使用该接口代替Runnable)。

  • 问题内容: 我刚刚开始用Java编写程序。以下Java代码是什么意思? What is String[] args? When would you use these args? 源代码和/或示例优先于抽象解释 问题答案: 在Java中,包含提供的命令行参数作为对象数组。 换句话说,如果你运行你的程序作为然后将包含。 如果要输出的内容,可以像这样遍历它们…

  • 我刚刚开始用Java编程。在讨论方法和构造函数时,我们使用的文本是缺乏的。我不确定方法或构造函数到底是什么,也不确定是什么让它们独一无二。有人能帮我定义它们并区分两者吗?