课时130:Lamda表达式
Lamda表达式的基础处理形式
从JDKl.8开始,为简化使用者进行代码的开发,专门提供有Lambda表达式支持,利用此操作形式可以实现函数式的编程。对于函数式编程比较著名的语言:Haskell、Scala。利用函数式的编程可以避免面向对象编程之中的一些繁琐的处理问题。
通过如下网站了解函数式编程的使用概念。
面向对象在其长期发展的过程之中有部分的反对者,这些反对者认为面向对象的设计过于复杂,并且过于繁琐。以最简单的程序为例子 。
范例:观察传统开发中的问题
Interface IMessage { Public void send(String str); } Public class JavaDemo { Public static void main(String args[]){ IMessage msg new IMessage () Public void send(){ System.out.println("消息发送:"+str): } } msg.send("www.mldn.cn");
进行编译执行,执行结果如下。
D:\mldnjava>javac JavaDemo.java JavaDemo..java:l0:错误:需要'; 1个错误 D:\mldnjava>java JavaDemo www.mldn.cn D:\mldnjava> 出现错误,进行更正。 Interface IMessage { Public void send(String str); } Public class JavaDemo { Public static void main(String args[]){ IMessage msg new IMessage () Public void send(){ System.out.println("消息发送:"+str): } } ; msg.send("www.mldn.cn");
D:\mldnjava>javac JavaDemo.java JavaDemo.java:6:错误:〈匿名JavaDemo$1>不是抽象的,并且未覆盖IMessage中的抽象方法send(String) IMessage msg new IMessage(){ JavaDemo.java:8:错误:找不到符号 System.out.printin("消息发送”+str); 符号:变量str 2个错误。 再次更正。 Interface IMessage { Public void send(String str); } Public class JavaDemo { Public static void main(String args[]){ IMessage msg new IMessage () Public void send(String str){ System.out.println("消息发送:"+str): } }; msg.send("www.mldn.cn");
执行程序出现。进行代码编译,再次执行。
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 消息发送:www.mldn.cn D:\mldnjava>
上述成功。
上述是一个简单的应用程序。
在这样一个程序里面,实际上核心的功能只有一行语句,“System.out.println("消息发送:"+str);
”,这一行的核心语句需要按照完整的面向对象给出的设计结构进行开发。
如下图所示:
Public static void main(String args[]){ IMessage msg new IMessage({ Public void send(String str) System.out.println("消息发送:"+str); } } msg.send("www.mldn.cn");
于是这些问题随着技术的不断发展越来越突出。在这种情况下java提供Lambda的表达式。
范例:使用Lambda表达式实现与之前完全一样的功能。
Public class JavaDemo { Public static void main(String args[]){ IMessage msg (str)->{ System.out.println("发送消息:"+st);
完成代码再次编译,执行。
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 发送消息:wwww.mldn.cn D:\mldnjava>
观察程序代码,整个代码实现过程之中完成一行语句System.out.println("发送消息:"+st);
目前整个程序代码只编写一行语句,利用这种形式就避免复杂的面向对象结构化的要求。这就是Lambda表达式的基本处理形式。
Lambda能够简化代码有一定的要求。
Lambda表达式若使用,须有一个重要的实现要求:
SAM (Single Abstract Method),
仅有一个抽象方法,以之前IMessage接口为例,在这个接口发现提供有一个Send方法,除此外无其它方法定义,此接口就被称为函数式接口,所以函数式接口才可以被Lambda表达式使用。
这就是Lambda的主要形式。
在代码中加入新方法,如下:
Interface IMessage { Public void send(String str); Public void get(); } 代码上显示: D:\mldnjava>javac JavaDemo.java JavaDemo..java:7: 错误:不兼容的类型:IMessage不是函数接口 IMessage msg (str)->{ 在接口IMessage中找到多个非覆盖抽象方法 1个错误
通常情况下为标明函数式接口,如下所示:
Functional Interface//函数式接口 Interface IMessage { Public void send(String str); Public void get(); }
再次编译,执行。
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 发送消息:www.mldn.cn D:\mldnjava> 成功。 范例:使用函数式接口注解 方法仅有一个。 Functional Interface//函数式接口 Interface IMessage { Public void send(String str); Public void send(); }
进行执行编译,
D:\mldnjava>javac JavaDemo.java JavaDemo.java:l:错误:意外的FunctionalInterface注释 FunctionalInterface //函数式接口 IMessage不是函数接口 在接口IMessage中找到多个非覆盖抽象方法 1个错误
回顾JDK1.8,接口可以定义普通方法和Static方法。
如下写出一个公共方法。
Functional Interface//函数式接口 Interface IMessage { Public void send(String str); Public default void print(){} 不加Default则为Upstract
在使用函数式编程时,出现掣肘行为。
Public class JavaDemo { Public static void main(String args[]){ IMessage msg (str)->{ System.out.println("消息发送:"+str): } msg.send ("www.mldn.cn"); msg.print () ; } }
在新版本之中提供有Default的方法的方法也都是为函数式开发准备出来的。
这就是Lambda具体操作。
对于Lambda表达式而言,提供有如下几种格式:
·方法没有参数:()->{};
·方法有参数:(参数,参数)->{;
·如果现在只有一行语句返回:(参数,参数)->语句;
范例:定义没有参数的方法
回到代码中:
Public class JavaDemo Public static void main(String args[]){ IMessage msg ()-> System.out.println("发送消息:w.mldn.cn"); }; msg.send(); } }
编译查看当前结果:
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 发送消息:www.mldn.cn D:\mldnjava>
这就是没有参数的处理形式。
范例:定义有参数的处理形式
FunctionalInterface //函数式接口 Interface IMath Public int add(int x,int y); } Public class JavaDemo Public static void main(String args[]){ IMath math (t1,t2)->{ Return t1+t2 ; }; System.out.println (math.add(10,20)); } }
代码进行编译,再依次执行。
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 30 D:\mldnjava>
以上的表达式之中你会发现只有一行语句,这个时候也可以进一步简化。
范例:简化Lambda操作
FunctionalInterface //函数式接口 Interface IMath Public int add(int x,int y); } Public class JavaDemo Public static void main(String args[]){ IMath math (t1,t2)->t1+t2; System.out.println (math.add(10,20)); } }
编码再次编译,执行。
D:\mldnjava>javac JavaDemo.java D:\mldnjava>java JavaDemo 30 D:\mldnjava>
利用Lamda表达式可以摆脱传统面向对象之中关于结构的限制,使得代码更加的简便。
Lamda 的主要目的是替换掉只有 SAM 标准的匿名内部位,只有一个抽象方法。如果有多个创作方法,不能替换掉,但可帮助我们避免结构化限制,这是它的优势所在,熟悉 Lamda 的操作,若出现函数式接口,都将用 Lamda 表达式进行描述。