如果将Object实例设置为null,为什么在方法引用(::)中使用实例方法时不抛出NullPointerException

  public class MethodReferenceTest {

        public static void main(String...strings){

            PredicateSample predicateSample = new PredicateSample();
            Predicate<String> predicate = predicateSample::isNotEmpty;
            // NullpointerException ???
            predicateSample = null;
            Arrays.asList("a","b","c",null)
                .stream()
                .filter(predicate)
                .forEach(System.out::println);
        }

        static class PredicateSample{
            public boolean isNotEmpty(String s){
                return ((s!=null) && (!s.isEmpty()));
            }
        }
    }

似乎在构造谓词后未调用predicateSample吗?

最佳答案

the language spec中的关键行是讨论方法引用的运行时评估的地方(重点是我的):


  • 如果表单是ExpressionName::[TypeArguments]标识符或主::::[TypeArguments]标识符...


  • ....
  • 目标引用是ExpressionName或Primary的值,在方法引用表达式被评估为时确定为


  • 因此,之后是否更改目标引用的值都没有关系。

    08-07 04:27