Java8 Lambda表达式详解及实例
作者:lqh 发布时间:2023-02-06 20:59:15
第一个Lambda表达式
在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式:
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Hello runnable");
}
};
...
thread.start();
上面的例子如果改成使用Lambda就会简单许多:
Runnable noArgs = ()->System.out.println("Hello Lambda!~");
...
thread.start();
Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参数部分,后面这是主体部分。
Lambda的其它形式
BinaryOperator<Long> add = (x,y)->x+y;
//OR
BinaryOperator<Long> add = (Long x,Long y)->x+y;
//OR
BinaryOperator<Long> add = (Long x,Long y)->{
x+y;
};
Lambda表达式使用 () 表示没有参数。
如果Lambda表达式中只包含一个参数,可省略掉 () 。
如果Lambda表达式的主题是一段代码块,需要使用 {} ,该代码块与普通的Java代码块并无区别,也可以返回或抛出异常。
如果参数的类型可以由编译器推断得出可以省略参数类型,当然你也可以加上。
那么问题来了:
BinaryOperator<Long> add = (Long x,Long y)->x+y; 是个什么意思?
这行代码并不是讲个数字相加,而是创建了一个函数,用来计算两个数字相加的结果。而add的类型是 BinaryOperator<Long> ,它也不是两个数字的和,而是将两个数字相加的那段代码。下面的例子展示如何使用这个变量:
BinaryOperator<Long> add = (Long x,Long y)->x+y;
Long res = add.apply(3L, 4L);
System.out.println("res="+res);//输出:res=7
函数接口
函数接口是只有一个抽象方法的接口,用作Lambda表达式的类型。
如 Runnable 就是一个函数接口。
新建一个我们自己的函数接口:
public interface AddOperator<T,D> {
long add(T one,D two);
}
使用:
AddOperator<Long,Long> addOperator = ( x, y)->x +y;
System.err.println("Custom function listener res= "+addOperator.add(34L, 65L));
目标类型
目标类型是指Lambda表达式所在上下文环境的类型。比如,将Lambda表达式赋值给一个局部变量,或传递给一个方法作为参数,局部变量或方法参数的类型就是Lambda表达式的目标类型。
final
如果我们在匿名内部类中引用了所在方法中的局部变量,这是需要局部变量是 final 的。
在Lambda中我们不需要将引用的外部局部变量声明为 final 的,但是该变量只能被赋值一次。
下面的例子中如果我们去掉注释,对name再次赋值,则无法通过编译,并显示出错信息: local variables referenced from a Lambda expression must be final or effectively final.
Lambda表达式引用的局部变量必须是final或即成事实的final。
String name = getUserName();
//name="hi";
button.addActionListener(event->System.out.println("name="+name));
类型推断
Lambda表达式的类型推断是Java7中就引入的目标类型推断的扩展。
java7中的类型推断:
List<String> list= new ArrayList<>();
上例中我们并没有指定ArrayList的范型类型,而是根据list的类型,推断出了ArrayList的范性类型。
如: AddOperator<Long,Long> addOperator = ( x, y)->x +y;
通过此文,希望能帮助到大家,学习理解,此部分知识,谢谢大家对本站的支持!
来源:http://www.jianshu.com/p/49b751742ffc


猜你喜欢
- springboot环境切换失效概述最近在使用-Dspring.profiles.active=te 来切换spring-boot的环境时,
- 下面分几部分介绍C#实现自动售货机接口的方法,代码写的非常详细,不懂的地方有注释可以参考下。MachineJP类:第1部分:串口初始化,串口
- PopupWindow是一个弹出式窗口,它可以展示任意View。他会浮在当前窗口的上方展示。下面看代码:public class MyAct
- 本文实例为大家分享了Unity实现颜色渐变滑动条的具体代码,供大家参考,具体内容如下效果展示代码直接挂在UGUI Slider上即可usin
- 本文实例为大家分享了Unity实现物体左右移动效果的具体代码,供大家参考,具体内容如下效果如下代码:using UnityEngine;us
- 本文介绍Android中Intent的各种常见作用。1 Intent.ACTION_MAINString: android.intent.a
- 阿里云accessID和secret请自行进入阿里云申请sms.template.code请进入阿里云,进行短信服务进行魔板添加开源代码地址
- 本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下:using System;using System.
- 本文实例讲述了C#实现闪动托盘图标效果的方法。分享给大家供大家参考,具体如下:在用户正在登录QQ或者使用Firemail邮件系统自动收取邮件
- 功能描述1、创建扑克牌。包括四种花色(黑桃,红心,梅花,方块),十三种点数(2-10,J,Q,K),不考虑大小王。2、创建两个玩家。包括玩家
- 设置session有效时间的三种方式session的默认有效时间是30分钟(min)方法一使用java函数:session.setMaxIn
- 话说,最近一次系统维护 用JS读取导入Excel中的实验数据,出现被自动四舍五入。后来到客户现场听客户反馈 Excel实验数据要
- 本文实例讲述了Android中悬浮窗口的实现原理。分享给大家供大家参考。具体如下:用了我一个周末的时间,个中愤懑就不说了,就这个问题,我翻遍
- 本篇文章介绍自定义View配合属性动画来实现如下的效果实现思路挺简单:画一个半透明的圆实现两种动画效果,点击时扩散和不点击时扩散回收使用线程
- 引入依赖<dependency> <groupId>org.apache.tika</groupI
- C# 5.0 给我们带来了三个非常有用的编译器特性CallerMemberNameCallerFilePathCallerLineNumbe
- 目录一、 全局JDK设置(默认配置)二、主题设置三、字体大小设置四、字符集和配置文件编码格式设置五、自动导入设置六、自动忽视大小写设置七、关
- Android 中ScrollView与ListView冲突问题的解决办法自定义MyListViewpublic class MyListV
- 本文实例讲述了C#用匿名方法定义委托的实现方法。分享给大家供大家参考。具体实现方法如下://用匿名方法定义委托 class Program
- 什么是 MyBatis?MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。 MyBatis 消除了几乎所有的 J