欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > java >内容正文

java

What?Java这么神奇的lambda表达式

发布时间:2024/10/14 java 64 豆豆
生活随笔 收集整理的这篇文章主要介绍了 What?Java这么神奇的lambda表达式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

目录:
1.面向对象的思想和函数式编程思想的概述
2.解决冗余的Runnable代码问题
3.Lambda标准格式及使用
4.对于Lambda表达式例子的解释

1.面向对象的思想和函数式编程思想的概述

面向对象的思想:找一个能解决事情的对象,然后靠调用对象的方法解决事情
函数式编程的思想:只要能获取到结果,谁做的怎么做的都不重要,只重视结果不重视过程

2.解决冗余的Runnable代码问题

1.冗余的Runnable代码问题
用Runnable创建多线程的例子:

package untl1; public class MyLambda {public static void main(String[] args) {A a=new A();Thread myThread=new Thread(a);myThread.start();} } class A implements Runnable{public void run() {System.out.println("我创建了一个新的线程");} }

正常情况下我们都会用上面代码的格式来使用Runnable接口,但是有的时候我们还可以用匿名内部类的形式来代替上边的代码:
对java内部类不是很了解的兄弟过来补补课
java内部类详解

package untl1; public class MyLambda {public static void main(String[] args) {new Thread(new Runnable() {public void run() {System.out.println("我创建了一个多线程");}}).start();;} }

总结上边的两个例子我们可以总结以下几点:

1.Thread 类需要 Runnable 接口作为参数,其中的抽象 run 方法是用来指定线程任务内容的核心;
2.为了指定 run 的方法体,不得不需要 Runnable 接口的实现类;
3.为了省去定义一个 RunnableImpl 实现类的麻烦,不得不使用匿名内部类;
4.必须覆盖重写抽象 run 方法,所以方法名称、方法参数、方法返回值不得不再写一遍,且不能写错;
5.而实际上,只有方法体才是关键所在。

2.对于以上的问题我们真的希望创建一个匿名内部类对象吗?不。我们只是为了做这件事情而不得不创建一个对象。我们真正希望做 的事情是:将 run 方法体内的代码传递给 Thread 类知晓。,lambda表达式给了我们更加简答的方式来run方法体内的代码传递给Thread知晓

我们先来感受以下lambda表达式的魅力,就以上代码我们使用Lambda表达式写试试:

package untl1; public class MyLambda {public static void main(String[] args) {new Thread(()->System.out.println("我创建了一个多线程")).start();} }

我当时看到这么写的时候我心里在想
卧槽这是个什么**玩意

别急,咱一步一步来

3.Lambda标准格式及使用

1.Lambda表达式的使用前提:

1.使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法
2.使用Lambda必须具有上下文推断。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

2.Lambda的标准格式:
格式由三个部分组成:

1.一些参数
2.一个箭头
3.一段代码

标准格式:

(参数类型 参数名称) ‐> { 代码语句 }

对格式的解释说明:

小括号:接口中抽象方法的参数列表,没有参数就空着,有参数就写出参数,多个参数用逗号分隔开
箭头:传递的意思,把参数传递给方法体
大括号:重写接口的抽象方法的方法体

3.在Lambda标准格式的基础上,使用省略写法的规则为:

1.小括号内参数的类型可以省略(这就是方法的参数是Lambda对应的接口类型的意义);
2.如果小括号内有且仅有一个参数,则小括号可以省略;
3. 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字及语句分号这里注意要省略三者要必须一起省略

4.对于省略写法的举例:
(1)对于无参数无返回值的就可以按照上边冗余的Runnable代码来看
(2)对于有一个参数,一个语句是return语句
比如我们写一个一个参数加上100并打印返回值的例子:
我们不用Lambda表达式可以这么写:

package untl1; public class MyLambda {public static void main(String[] args) {A(10,new Add() {//这里的10就会赋值给apublic int add(int a) {return a+100;}});}public static void A(int b,Add a){System.out.println(a.add(b));} } interface Add{abstract int add(int a); } 运行结果: 110

那么用Lambda表达式就如下:

package untl1; public class MyLambda {public static void main(String[] args) {A(10, m->m+ 100);}public static void A(int b,Add a){System.out.println(a.add(b));} } interface Add{abstract int add(int a); } 运行结果: 110

如果运算两个参数的和并且输出结果:
正常写法:

package untl1; public class MyLambda {public static void main(String[] args) {int m=2;int n=5;A(m, n, new Add() {public int add(int a, int b) {return a+b;}});}public static void A(int a,int b,Add c){System.out.println(c.add(a,b));} } interface Add{abstract int add(int a,int b); } 运算结果: 7

使用Lambda表达式:

package untl1; public class MyLambda {public static void main(String[] args) {int m=3;int n=4;A(m, n, (x,y)->{return x+y;});}public static void A(int a,int b,Add c){System.out.println(c.add(a,b));} } interface Add{abstract int add(int a,int b); }

4. 对于Lambda表达式例子的解释

拿这个例子来说

package untl1; public class MyLambda {public static void main(String[] args) {int m=3;int n=4;A(m, n, (x,y)->{return x+y;});}public static void A(int a,int b,Add c){System.out.println(c.add(a,b));} } interface Add{abstract int add(int a,int b); }

注意Lambda的格式,由于有两个参数所以不能省略大括号分号和参数的小括号,但是参数类型还是可以省略的,这里可能会有疑问的x,y是哪里来的卧槽连一个参数类型都没有,来来来拖出去乱棍打死,由于我们强大的Lambda所以我们的变量类型不用说明编译器自动匹配,然后这里的x,y所代表的值在A函数体的内部就会被当作m,n,因为x,y代表a和b而且m,n也代表a和b,所以x,y就代表m,n

总结

以上是生活随笔为你收集整理的What?Java这么神奇的lambda表达式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。