静态方法参考Java 8

时间:2017-01-14 07:54:46

标签: java lambda java-8

我试图围绕Java 8概念。在方法引用的上下文中,我想知道在我的情况下接受'谓词谓词'对象的流过滤器方法如何也可以接受同一类中的静态方法。示例如下。

public class App 
{
    public static void main( String[] args )
    {
        List<Integer> intList = Arrays.asList(1,2,3,4,5);
        intList.stream().filter( e -> e > 3 ).forEach(System.out::println);

        intList.stream().filter( App::filterNosGrt3 ).forEach(System.out::println);

    }


    public static boolean filterNosGrt3(Integer no)
    {
        if(no>3)
            return true;
        else
            return false;
    }
}

让我感到困惑的是Lambda,它本身就是一个对象,静态方法没有附加任何对象。那么它如何满足过滤方法呢。

由于

1 个答案:

答案 0 :(得分:2)

写作时

intList.stream().filter( App::filterNosGrt3 ).forEach(System.out::println);

你有效地写作:

intList.stream().filter(e -> App.filterNosGrt3(e)).forEach(System.out::println);

它只是方法参考的一个特征。来自Java method references tutorial

  

使用lambda表达式创建匿名方法。但是,有时,lambda表达式只会调用现有方法。在这些情况下,通过名称来引用现有方法通常更清楚。方法参考使您可以这样做;对于已有名称的方法,它们是紧凑的,易于阅读的lambda表达式。

     

...

     

方法引用Person::compareByAge在语义上与lambda表达式(a, b) -> Person.compareByAge(a, b)相同。每个都有以下特点:

     
      
  • 其正式参数列表是从Comparator<Person>.compare复制的,(Person, Person)
  •   
  • 它的身体调用方法Person.compareByAge
  •