我试图围绕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,它本身就是一个对象,静态方法没有附加任何对象。那么它如何满足过滤方法呢。
由于
答案 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
。