方法引用的基本使用
1、例子中用到的函数式接口
package com.ly.demo.java8; /** * @author liuyang * @create 2020-05-17 23:16 */ @FunctionalInterface public interface IntArrayBuilder { int[] buildIntArray(int len); }
package com.ly.demo.java8; /** * @author liuyang * @create 2020-05-17 21:57 */ // 函数接口,有且仅有一个抽象方法的接口 @FunctionalInterface public interface MyInterface { void print(String str); }
package com.ly.demo.java8; /** * @author liuyang * @create 2020-05-17 23:00 */ @FunctionalInterface public interface MyObjBuilder { MyObj build(String name,Integer age); }
2、例子中用到的类
package com.ly.demo.java8; /** * @author liuyang * @create 2020-05-17 21:57 */ public class MyObj extends MyObjSup { public String name; public Integer age; public MyObj() { } public MyObj(String name, Integer age) { this.name = name; this.age = age; } public void printStr(MyInterface mi, String str) { mi.print(str); } public void printUpperCase(String str) { System.out.println(str.toUpperCase()); } public static void printLowerCase(String str) { System.out.println(str.toLowerCase()); } @Override public void sayHello(String s) { System.out.println("MyObj-你好,我是:"+s); } public void say1() { // 引用父类的方法 printStr(super::sayHello,"小明"); } public void say2() { // 引用本类的方法 printStr(this::sayHello,"小芳"); } MyObj buildMyObj(MyObjBuilder myObjBuilder,String name,Integer age) { return myObjBuilder.build(name,age); } int[] createIntArray(int len,IntArrayBuilder iab) { return iab.buildIntArray(len); } }
package com.ly.demo.java8; /** * @author liuyang * @create 2020-05-17 22:31 */ public class MyObjSup { public void sayHello(String s) { System.out.println("MyObjSup-你好,我是:"+s); } }
3、测试类
package com.ly.demo.java8; import org.junit.Test; /** * @author liuyang * @create 2020-05-17 22:00 */ public class MethodRefTest { @Test public void test1() { MyObj myObj = new MyObj(); // 函数式接口都可以用Lambda表达式代替 myObj.printStr(s -> System.out.println(s),"hello1"); } @Test public void test2() { MyObj myObj = new MyObj(); // Lambda表达式也可以用方法引用替代 // 被引用方法的入参必须和函数式接口方法的入参一致 myObj.printStr(System.out::println,"hello2"); } @Test public void test3() { MyObj myObj = new MyObj(); // 引用对象的实例方法 myObj.printStr(myObj::printUpperCase,"hello3"); } @Test public void test4() { MyObj myObj = new MyObj(); // 引用类的静态方法 myObj.printStr(MyObj::printLowerCase,"HELLO4"); } @Test public void test5() { // 测试引用父类的方法 new MyObj().say1(); } @Test public void test6() { // 测试引用本类的方法 new MyObj().say2(); } @Test public void test7() { // 测试引用构造方法 MyObj myObj = new MyObj().buildMyObj(MyObj::new,"liuyang",18); System.out.println(myObj.name); System.out.println(myObj.age); } @Test public void test8() { // 测试引用数组的构造方法 int[] arr = new MyObj().createIntArray(10,int[]::new); System.out.println(arr.length); } }
相识是缘