java8之lambda表达式(2)-方法引用
方法引用使用的地方也是在函数式接口,使用方法引用可以使代码更加简单和便捷
在如下代码中
根据List中字符串长度排序的代码可以写成如下:
public static void test1_() { List<String> strLst = new ArrayList<String>() { { add("adfkjsdkfjdskjfkds"); add("asdfasdfafgfgf"); add("public static void main"); } }; Collections.sort(strLst, String::compareToIgnoreCase); System.out.println(strLst); }
只要方法的参数和返回值类型与函数式接口中抽象方法的参数和返回值类型一致,就可以使用方法引用。
方法引用主要有如下三种使用情况
- 类::实例方法
- 类::静态方法
- 对象::实例方法
其中后两种情况等同于提供方法参数的lambda表达式,如System.out::println 等同于(x)->System.out.println(x),Math::pow 等同于(x,y)->Math.pow(x,y).
第一种中,第一个参数会成为执行方法的对象,String::compareToIgnoreCase)等同于(x,y)->x.compareToIgnoreCase(y)
此外,方法引用还可以使用this::methodName及super::methodName表示该对象或者其父类对象中的方法
class Father { public void greet() { System.out.println("Hello, i am function in father!"); } } class Child extends Father { @Override public void greet() { Runnable runnable = super::greet; new Thread(runnable).start(); } } public static void main(String[] args){ new Child().greet(); }
最后打印的结果为:Hello, i am function in father!