java1.8 拉姆达表达式_JAVA1.8新特性 Lamda表达式

Lamda表达式,读作λ表达式,它实质属于函数式编程的概念,要理解函数式编程的产生目的,就要先理解匿名内部类。

先来看看传统的匿名内部类调用方式:

48304ba5e6f9fe08f3fa1abda7d326ab.png

interfaceMyInterface{voidlMethod();

}public classMain {public static voidtest(MyInterface myInterface){

myInterface.lMethod();

}public static voidmain(String[] args) {

test(newMyInterface() {

@Overridepublic voidlMethod() {

System.out.println("Hello World!");

}

});

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

在主类中的这么几行代码,嵌套几层就为了输出一个Hello World!是不是很麻烦?但是由于java结构的完整性,我们还不得不那么做,现在JDK1.8来了。

再来看看使用Lamda表达式改写上面的代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

interfaceMyInterface{voidlMethod();

}public classMain {public static voidtest(MyInterface myInterface){

myInterface.lMethod();

}public static voidmain(String[] args) {

test(()->System.out.println("Hello World!"));

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

这就是Lamda表达式语言,为了解决匿名内部类繁杂的操作而出现。

Lamda语法有三种形式:

(参数) ->单行语句;

(参数) ->{多行语句};

(参数) ->表达式;

括号()可以大致理解为就是方法,里面是参数变量,在上面的例子中()->System.out.println("Hello World!") 前面的()代表void lMethod()方法,它没有入参,所以为空,->后面是一个单行语句;

如果->后面是多行语句,需要用{ }装起来,每条语句后需要有分号;

->后面也可以是一个表达式,如:a+b等。

(参数) ->单行语句:

48304ba5e6f9fe08f3fa1abda7d326ab.png

interfaceMyInterface{voidlMethod(String str);

}public classMain {public static voidtest(MyInterface myInterface){

myInterface.lMethod("Hello World!");//设置参数内容

}public static voidmain(String[] args) {//首先在()中定义此表达式里面需要接收变量s,后面的单行语句中就可以使用该变量了

test((s)->System.out.println(s));

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

(参数) ->{多行语句}:

48304ba5e6f9fe08f3fa1abda7d326ab.png

interfaceMyInterface{voidlMethod(String str);

}public classMain {public static voidtest(MyInterface myInterface){

myInterface.lMethod("Hello World!");//设置参数内容

}public static voidmain(String[] args) {//首先在()中定义此表达式里面需要接收变量s,后面的多行语句中就可以使用该变量了。注意:多行语句别少“;”号

test((s)->{

s=s+s;

System.out.println(s);

});

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

(参数) ->表达式:

48304ba5e6f9fe08f3fa1abda7d326ab.png

interfaceMyInterface{int lMethod(int a,intb);

}public classMain {public static voidtest(MyInterface myInterface){int result=myInterface.lMethod(1,2);//设置参数内容,接收返回参数

System.out.println(result);

}public static voidmain(String[] args) {

test((x,y)-> x*y );//调用方法//相当于//test((x,y)-> {return x*y;});

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

这样,Lamda表达式就看起来很简单了,有不有!

匿名内部类,我们比较常用的地方在哪儿?线程类Thread,以前我们可能这样写:

48304ba5e6f9fe08f3fa1abda7d326ab.png

new Thread(new Runnable() { @Override public void run() { System.out.println("线程操作!"); }});

48304ba5e6f9fe08f3fa1abda7d326ab.png

现在,使用Lamda表达式,简单写为:

new Thread(()->System.out.println("线程操作!"));

总结:利用Lamda表达式是为了避免匿名内部类定义过多无用的操作。

转载自:https://www.cnblogs.com/hyyq/p/7425666.html

若接口中有多个函数,如何使用lambda表达式?

Lambda表达式只支持函数式接口,也就是只有一个抽象方法的接口。

可以使用@FunctionalInterface标注函数式接口,在编译时提前发现错误。

例子:

1 packagetest;2 @FunctionalInterface3 public interface IParmas1{4 voidcall(A a);5 voidcall2(A a);6 }

编译时会报错:

Invalid '@FunctionalInterface' annotation; IParmas1 is not a functional interface   就是因为使用了这个注解 接口只能写一个抽象方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值