Java day16【第二十九章】函数式编程
【第二十九章】函数式编程
一.Lamda表达式
interface IMessage{ public void send(String str); } public class Message{ public static void main(String[] args) { IMessage msg = new IMessage(){ public void send(String str) { System.out.println("Send Message:"+ str); } }; msg.send("Tsy"); } }
匿名内部类,在这样的一个程序里,核心语句:
System.out.println("Send Message:"+ str);
为了这一句话,我们需要严格遵守面向对象开发的流程进行。
范例:使用Lambda表达式实现相同功能:
interface IMessage{ public void send(String str); } public class Message{ public static void main(String[] args) { IMessage msg = (str)->{ System.out.println("Send Message:"+ str); }; msg.send("Tsy"); } }
现在整个程序代码编写了一行语句,避免了复杂的面向对象的过程。
Lambda表达式:SAM(只有一个抽象方法)
Lambda表达式格式:
方法没有参数()->{};
方法有参数:(参数,参数)->{};
如果现在只有一行语句返回:(参数,参数)->{语句};
二.方法引用:
引用数据类型最大的特点是可以进行内存的指向处理
方法引用:不同的方法名称可以描述同一个方法。
1.方法引用的四种形式:
(1)引用静态方法:类名称::static方法名称;
(2)引用某个实例对象的方法:实例化对象::普通方法;
(3)引用特定类型的方法:特定类::普通方法;
(4)引用构造方法:类名称::new
范例:观察静态方法(String类中的String.valueOf()方法):
@FunctionalInterface //函数式接口 interface IFunction<P,R>{ public R change(P p); } public class Message{ public static void main(String[] args) { IFunction<Integer,String> fun = String::valueOf; String str = fun.change(101); System.out.println(str.length()); } }
范例:引用实例化对象中的方法
@FunctionalInterface //函数式接口 interface IFunction<R>{ public R upper(); } public class Message{ public static void main(String[] args) { IFunction<String> fun = "www.mldn.com"::toUpperCase; String str = fun.upper(); System.out.println(str); } }
范例:特定类中的方法
String中比较大小的方法:public int compareTo(String anotherString);
@FunctionalInterface //函数式接口 interface IFunction<R>{ public int compare(R r1,R r2); } public class Message{ public static void main(String[] args) { IFunction<String> fun = String::compareTo; System.out.println(fun.compare("a","A")); } }
范例:构造方法的引用(最具有杀伤力)
class Person { private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public String toString(){ return "姓名:"+this.name + "、年龄:"+ this.age; } } @FunctionalInterface interface IFunction<R>{ public R create(String name,int age); } public class Message{ public static void main(String[] args) { IFunction<Person> fun = Person::new; System.out.println(fun.create("张三",11).toString()); } }
提供方法引用的概念更多情况下也只是弥补了对于引用的支持功能。