lambda表达式和方法引用

时间:2022-05-04 19:05:11

lambda表达式和方法引用是孪生兄弟,方法引用的使用在很多情况下简化了lambda表达式。

方法引用符  ::

由lambda表达式简化得到方法引用,体验方法引用:

 1 package cn.ftf.add;  2 
 3 public class PrintableDemo {  4     public static void main(String[] args) {  5         //lambda表达式
 6         print(s->System.out.println(s));  7         //方法引用
 8  print(System.out::println);  9  } 10     static void print(Printable p) { 11         p.printString("hello word!"); 12  } 13 } 14 
15 interface Printable { 16     void printString(String s); 17 
18 }

引用类方法:

 1 package cn.ftf.add;  2 /**
 3  * 引用类方法,例将字符串通过Integer.parseInt()转化为大写字符串  4  * @author 房廷飞  5  *  6  */
 7 public class ConverterDemo {  8     public static void main(String[] args) {  9  useConverter(Integer::parseInt); 10  } 11     static void useConverter(Converter con) { 12         int a=con.convert("34"); 13  System.out.println(a); 14  } 15 } 16 
17 interface Converter { 18     int convert(String a); 19 
20 }

引用对象的实例方法:

 1 package cn.ftf.add;  2 /*
 3  * 引用对象的实例方法  4  */
 5 public class PrinterDemo {  6     public static void main(String[] args) {  7         //使用lambda表达式
 8         usePrinter(s->System.out.println(s.toUpperCase()));  9         //使用对象的实例方法
10         PrintString pr=new PrintString(); 11  usePrinter(pr::printUpper); 12         
13         //如果方法是静态的就直接类::方法名
14  usePrinter(PrintString::printUpper1); 15  } 16     static void usePrinter(Printer pr){ 17         pr.printUpperCase("hello word!"); 18  } 19 } 20 
21 interface Printer { 22     void printUpperCase(String a); 23 } 24 
25 class PrintString { 26     public void printUpper(String str) { 27  System.out.println(str.toUpperCase()); 28  } 29     static void printUpper1(String str) { 30  System.out.println(str.toUpperCase()); 31 
32  } 33 
34 }

引用类的实例方法:

 1 package cn.ftf.add;  2 /*
 3  * 引用类的实例方法  4  */
 5 public class MyStringDemo {  6     public static void main(String[] args) {  7         //使用lambda表达式
 8         useMyString((str,a,b)->str.substring(a, b));  9         //使用类中的实例方法
10  useMyString(String::substring); 11         //lambda表达式被类的实例方法替代的时候,第一个参数最为调用者,后面的参数作为方法参数,如上例 
12  } 13     static void useMyString(MyString mys) { 14         String str=mys.mySubString("hello", 2 ,4); 15  System.out.println(str); 16  } 17 } 18 interface MyString{ 19     String mySubString(String str,int a,int b); 20 }

引用构造器:

 1 package cn.ftf.add;  2 /*
 3  * 引用构造器  4  */
 5 public class StudentDemo {  6     public static void main(String[] args) {  7         //lambda表达式
 8         useStudentBuilder((s,a)->new Student(s, a));  9         //引用构造器
10         useStudentBuilder(Student::new); 11         //将参数全部传到构造器中
12  } 13     private static void useStudentBuilder(StudentBuilder stu) { 14         Student s= stu.build("小飞", 20); 15         System.out.println(s.getName()+"  "+s.getAge()); 16         
17  } 18 
19 } 20 
21 
22 class Student{ 23     public Student(String name, int age) { 24         super(); 25         this.name = name; 26         this.age = age; 27  } 28  String name; 29     int age; 30     public String getName() { 31         return name; 32  } 33     public void setName(String name) { 34         this.name = name; 35  } 36     public int getAge() { 37         return age; 38  } 39     public void setAge(int age) { 40         this.age = age; 41  } 42     
43 } 44 interface StudentBuilder{ 45     Student build(String name,int age); 46 }