what?java这么神奇的lambda表达式 -ag凯发k8国际
目录:
1.面向对象的思想和函数式编程思想的概述
2.解决冗余的runnable代码问题
3.lambda标准格式及使用
4.对于lambda表达式例子的解释
面向对象的思想:找一个能解决事情的对象,然后靠调用对象的方法解决事情
函数式编程的思想:只要能获取到结果,谁做的怎么做的都不重要,只重视结果不重视过程
1.冗余的runnable代码问题
用runnable创建多线程的例子:
正常情况下我们都会用上面代码的格式来使用runnable接口,但是有的时候我们还可以用匿名内部类的形式来代替上边的代码:
对java内部类不是很了解的兄弟过来补补课
java内部类详解
总结上边的两个例子我们可以总结以下几点:
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();} }我当时看到这么写的时候我心里在想
卧槽这是个什么**玩意
别急,咱一步一步来
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表达式可以这么写:
那么用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如果运算两个参数的和并且输出结果:
正常写法:
使用lambda表达式:
package untl1; public class mylambda {public static void main(string[] args) {int m=3;int n=4;a(m, n, (x,y)->{return xy;});}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); }拿这个例子来说
package untl1; public class mylambda {public static void main(string[] args) {int m=3;int n=4;a(m, n, (x,y)->{return xy;});}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
总结
以上是ag凯发k8国际为你收集整理的what?java这么神奇的lambda表达式的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: java函数式接口看这一篇就够了