java8中lambda表达式
来源:互联网 发布:岚皋数据运营招聘 编辑:程序博客网 时间:2024/06/05 22:31
函数式接口
什么是函数式接口
函数式接口具有两个主要特征,是一个接口,这个接口具有唯一的一个抽像方法,我们将满足这两个特性的接口称为函数式接口。函数式接口是Java 8为支持Lambda表达式新发明的。
Lambda表达式不能脱离目标类型存在,这个目录类型就是函数式接口。
函数式接口可以使用@FunctionalInterface进行标注。
lambda表达式
概念
lambda表达式是JAVA8中提供的一种新的特性,它支持java也能进行简单的“函数式编程”。它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
语法
基本语法:
(parameters) -> expression 或 (parameters) ->{ statements; }
即: 参数 -> 带返回值的表达式/无返回值的陈述。
特性
1. 类型推导
编译器负责推导lambda表达式的类型。它利用lambda表达式所在上下文所期待的类型进行推导,
这个被期待的类型被称为目标类型。就是说我们传入的参数可以无需写类型了!
2.变量捕获
在java 7中,编译器对内部类中引用的外部变量(即捕获的变量)要求非常严格:
如果捕获的变量没有被声明为final就会产生一个编译错误。
我们现在放宽了这个限制——对于lambda表达式和内部类,
我们允许在其中捕获那些符合有效只读(Effectively final)的局部变量。
简单的说,如果一个局部变量在初始化后从未被修改过,那么它就符合有效只读的要求,
换句话说,加上final后也不会导致编译错误的局部变量就是有效只读变量。
注意:此处和final关键字一样,指的是引用不可改!(感觉没多大意义,还不是用的final)
3.方法引用
如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。
Comparator byName = Comparator.comparing(Person::getName);
此处无需再传入参数,lambda会自动装配成Person类型进来然后执行getName()方法,而后返回getName()的String
方法引用有很多种,它们的语法如下:
静态方法引用:ClassName::methodName
实例上的实例方法引用:instanceReference::methodName
超类上的实例方法引用:super::methodName
类型上的实例方法引用:ClassName::methodName
构造方法引用:Class::new
数组构造方法引用:TypeName[]::new
4.JAVA提供给我们的SAM接口
java 8中增加了一个新的包:java.util.function,它里面包含了常用的函数式接口,例如:
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
那么在参数为这些接口的地方,我们就可以直接使用lambda表达式了。
例子
// Java 8之前:
new
Thread(
new
Runnable() {
@Override
public
void
run() {
System.out.println(
"Before Java8, too much code for too little to do"
);
}
}).start();
//Java 8方式:采用lambda表达式
new
Thread( () -> System.out.println(
"In Java8, Lambda expression rocks !!"
) ).start();
优缺点
优点:
1.极大的简化代码,使得代码更为简洁明了。
2.比匿名内部类更加高效。
缺点:
可读性差。在代码简洁的情况下,另一方面又让大多程序员很难读懂。因为很少程序员接触使用它。
- java8中lambda表达式
- java8 中Lambda表达式
- JAVA8中Lambda表达式入门
- Java8中Lambda表达式学习
- java8中Lambda表达式的使用
- java8中lambda表达式用法再探
- Java8 Lambda表达式教程
- Java8 Lambda表达式教程
- Java8: Lambda表达式语法
- java8 Lambda表达式
- Java8 Lambda表达式教程
- Java8 Lambda表达式
- java8 Lambda表达式
- Java8 Lambda表达式教程
- Java8 Lambda表达式教程
- Java8 Lambda表达式教程
- java8 lambda表达式-语法
- java8 lambda表达式-其他
- HDU 6064 RXD and numbers(BEST theorem)
- Struts2学习笔记(十)——数据校验
- Java----JUC
- Bootstrap基础18——选项卡tab
- 阿里云云大使经验分享:老司机9招带你玩转云大使推广
- java8中lambda表达式
- lsof 02实用命令
- eclipse 创建maven 项目 动态web工程完整示例
- 解决npm 的 shasum check failed for错误
- 33day 新浪微博(获取用户微博数据)
- Struts2学习笔记(十一)——自定义拦截器
- 集合是否包含某些元素,获取元素索引位置,元素排序(三)
- iOS Apple Pay详解以及处理支付逻辑(附带Demo) 等资料
- ubuntu下ftp服务器的安装和访问(转)