java之Lambda表达式

时间:2020-12-25 22:12:06

Lambda表达式这是java8拥有的新特性,个人感觉也是提高开发速度的一个进步。
接下来我们来举俩个例子来看一下Lambda这个表达式是不是很方便


这个是用匿名内部类来实现的:

interface A{
void print() ;
}

public class My{
public static void main(String[] args){
A a = new A(){
public void print(){
System.out.println("匿名内部类") ;
}
} ;

a.print() ;
}
}

这个是用Lambda表达式来实现的:

interface A{
void print() ;
}

public class My{
public static void main(String[] args){
A a = ()->System.out.println("Lambda") ;

a.print() ;
}
}

从上面的俩个例子我们可以清晰的看到,用匿名类实现需要6行代码,然而用Lambda表达式只需要俩行代码就可以搞定,是不是很方便?

我先介绍一下Lambda在什么时候可以用?

Lambda表达式必须在实现函数式接口时才可以用。函数式接口的概念是:只包含一个抽象方法的接口,但是这个接口可以包含其他类方法和默认方法(默认方法也是java8的新特性哦)。



知道了什么时候可以用Lambda表达式接下来我在具体说下Lambda表达是怎么使用的。


Lambda表达式的组成:

         1.要实现的函数式接口中的函数形参列表。形参列表允许省略形参的类型,并且当形参只有一个时,我们可以省略‘(’和‘)’;

         2.箭头->。

         3.要实现的函数式接口中的函数代码块。如果代码块的代码只有一句,那么我们可以省略‘{’和‘}’。当代码块只有一句且需要返回值时可以省略return。


再举一个例子来给大家看一下:

interface Eatable{
void taste() ;
}
interface Flyable{
void fly(String weather) ;
}
interface Addable{
int add(int a, int b);
}

public class My{
public static void main(String[] args){

Eatable eat = ()->System.out.println("Lambda还不错") ;
eat.taste() ;
Flyable fl = weather->System.out.println(weather+"是啊,是个飞行的日子");//该fly方法中只有一个参数所以我们可以省去‘(‘和’)‘。
fl.fly("今天天气不错") ;
Addable ad = (a,b)->a+b ;
System.out.println("12+13="+ad.add(12,13));//该add方法中需要返回值且代码块里只有一句所以我们可以省略return
}
}

相信通过这个例子大家应该可以明白我上面说的几句话了

12月1日写


昨晚因为因为时间关系今天继续续写:


前面已经介绍了如果Lambda表达式的代码块中只有一条代码,程序就可以省略Lambda表达式中代码块的花括号。其实在Lambda表达式的代码块只有一条代码时,还可以在代码块中使用方法引用和构造器引用。


引用类方法和构造方法的实例:

import javax.swing.* ;
import java.lang.* ;
interface Converter{
Integer convert(String from) ;
}

interface MyTest{
String test(String a, int b, int c) ;
}

interface YouTest{
JFrame win(String title) ;
}

public class My{

public static void main(String[] args){
//引用类方法
Converter con1 = from->Integer.valueOf(from) ; //Lambda表达式
Converter con11 = Integer::valueOf ; //简化的Lambda表达式
//引用特定对象的实例方法
Converter con2 = from->"hello".indexOf(from) ;
Converter con22 = "hello"::indexOf ;
//引用某类对象的实例方法
MyTest mt1 = (a,b,c)->a.substring(b,c);
MyTest mt11 = String::substring ;
//引用构造方法
YouTest yt1 = title->new JFrame(title) ;
YouTest yt11 = JFrame::new ;

System.out.println(con1.convert("123456")) ;
System.out.println(con11.convert("123456")) ;
System.out.println(con2.convert("e")) ;
System.out.println(con22.convert("e")) ;
System.out.println(mt1.test("China",0,3)) ;
System.out.println(mt11.test("China",0,3)) ;
yt1.win("窗口") ;
yt11.win("窗口") ;

}
}

由实例总结:

Lambda表达式支持的方法引用和构造器引用
种类 示例 说明 对应的Lambda表达式
引用类方法 类名::类方法名称 函数式接口中被实现方法的全部参数传给该类方法作为参数 (a,b,....)->类名.类方法(a,b,...)
引用特定对象的实例方法 特定对象::实例方法名称 函数式接口中被实现方法的全部参数传给该方法作为参数 (a,b,....)->特定对象.实例方法(a,b...)
引用某个类的实例方法 类名::实例方法名称 函数式接口中被实现的方法的第一个参数作为调用者,后面的参数全部传给方法作为参数 (a,b,....)->a.实例方法(b,....)
引用构造放方法 类名::new 函数式接口中被实现方法的全部参数传给该构造器作为参数 (a,b...)->new 类名(a,b...)

最后为大家说一下Lambda和匿名内部类的区别:


1.匿名内部类可以任意创建实例——不管接口包含多少个抽象方法,只要匿名内部类实现的所有抽象放方法即可;但是Lambda只能用于函数式接口。

2.匿名内部类可以为抽象类甚至普通类创建实例,Lambda只能给函数式接口创建实例。

3.匿名内部类实现的抽象方法的方法允许调用接口中定义的默认方法;但Lambda表达式不允许调用接口中定义的默认方法。