使用java 8中的instance方法:使用null Object的方法引用

SEY*_*_91 4 java java-8

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

  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()));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

predicateSample在构造Predicate之后似乎没有调用?

And*_*ner 8

语言规范中的关键是它讨论方法引用的运行时评估(强调我的):

  • 如果表单是ExpressionName :: [TypeArguments] Identifier或Primary :: [TypeArguments] Identifier ...

    • ....
    • 目标引用是ExpressionName或Primary的值,在计算方法引用表达式时确定.

因此,如果您之后更改目标引用的值并不重要.