在JLS,第15.13.3描述方法引用的运行评估。
方法参考表达式评估的时间比lambda表达式(第15.27.4节)更复杂。
当方法引用表达式的::分隔符之前具有表达式(而不是类型)时,将立即对该子表达式求值。该 评价的结果被存储,直到相对应的功能的接口类型的方法被调用;
此时,结果将用作调用的目标参考。这意味着::分隔符之前的表达式仅在程序遇到方法引用表达式时才被评估,并且不会在后续对功能接口类型的调用时被重新评估。
(加粗强调我的)
基本上
s,将对方法引用的引用存储为以后执行。在这里,字符串
"HelloWorld"被保存以供以后执行方法引用。因此,即使在方法引用的声明之后设置
s为
null,但在执行之前设置为
Function,它仍将使用字符串
"HelloWorld"。
设置为
null不能保证垃圾收集器会收集它,也不能保证立即收集垃圾。
另外,在这里,方法参考中仍然有一个参考,因此这里根本不会收集垃圾。
最后,lambda表达式主体具有2种形式:一个表达式和一个语句块(可能带有return语句)。用
Function<Integer, String> f = t -> t + "";
那是一种表达。等效的block语句为:
Function<Integer, String> f = t -> { return t + "";};


