Java8函数式接口和Lambda表达式
两者关系:
Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作为方法的参数也是可以的。
函数式接口只有一个抽象方法,并且没有重写Object类中的方法(Object类中的public的方法除外),可以有默认方法和静态方法。
函数式接口一般用注解@FunctionalInterface标注。
例子:
1、声明一个函数式接口
@FunctionalInterface
public interface Calculator { double calculate(int a, int b); }
2、使用Lambda表达式(参数类型可省略)
Calculator division = (int a, int b) -> (double) a / b;
System.out.println(division.calculate(5, 2)); // prints 2.5
另一个例子(使用jdk标准库内的函数式接口,下滑至文末查看更多):
Function<Integer, Integer> selfIncrease = x -> x + 1;
Function<Integer, Integer> twiceValue = x -> 2*x;
Consumer<Integer> printNum = x -> System.out.println("2x+1:"+selfIncrease.apply(x)); int [] numbers= {1, 2, 3};
Arrays.stream(numbers).boxed().map(twiceValue).forEach(printNum);
System.out.println("通过表达式后的数组:"+Arrays.toString(numbers));
输出:
2x+1:3
2x+1:5
2x+1:7
通过表达式后的数组:[1, 2, 3]
3、使用Lambda表达式作为方法参数
public static void main(String[] args) throws Exception {
execute(a -> String.valueOf(a + 1), 10);
}
public static void execute(Function<Integer, String> func, int num) {
System.out.println(func.apply(num));
}
4、问题
- 标准库内没有提供支持更多参数的函数式接口
- lambda表达式中引用到的变量需要实际是final
// 编译通过
public static void main(String[] args) throws Exception {
int num = 10;
Function<Integer, Integer> lambda = x -> x + num;
} // 编译错误
public static void main(String[] args) throws Exception {
int num = 10;
num += 1;
Function<Integer, Integer> lambda = x -> x + num;
}
5、函数式接口
http://www.cnblogs.com/IcanFixIt/p/4284418.html
|
函数式接口 |
描述 |
|
Function |
传递一个参数返回一个结果。这个结果的类型可以与参数的类型不相同。 |
|
BiFunction |
传递两个参数返回一个结果。这个结果的类型可以与任一参数的类型不相同。 |
|
UnaryOperator |
代表一个操作符的操作,它的返回结果类型与操作符的类型一样。实际上它可以被看作是Function 它的返回结果跟参数一样,它是Function 的子接口。 |
|
BiOperator |
代表两个操作符的操作,它的返回结果类型必须与操作符相同。 |
|
Predicate |
传递一个参数,基于参数的值返回boolean值。 |
|
Supplier |
代表一个供应者的结果。 |
|
Consumer |
传递一个参数但没有返回值。 |
具体使用可以查看jdk源码里的抽象方法的方法返回值,方法参数,以及函数式接口定义说明。
参考:
http://www.cnblogs.com/IcanFixIt/p/4284418.html
Java8函数式接口和Lambda表达式的更多相关文章
- Java8函数式接口以及lambda表达式实践
罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...
- Java函数式接口与Lambda表达式
什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...
- Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法
1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...
- Java函数式编程:一、函数式接口,lambda表达式和方法引用
Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...
- Java8 学习笔记--函数式接口与lambda表达式的关系
在java中,lambda表达式与函数式接口是不可分割的,都是结合起来使用的. 对于函数式接口,我们可以理解为只有一个抽象方法的接口,除此之外它和别的接口相比并没有什么特殊的地方.为了确保函数式接口的 ...
- Java 关于函数式接口与Lambda表达式之间的关系
java是一种面向对象的语言,java中的一切都是对象,即数组,每个类创建的实例也是对象.在java中定义的函数或方法不可能完全独立,也不能将方法函数作为参数或返回值给实例. 在java7及以前,我们 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- Java8函数式编程和lambda表达式
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
- 函数式接口和Lambda表达式
函数式接口(一般标有@FunctionalInterface)就是只定义一个抽象方法的接口. 一个接口,如果满足函数式接口的定义,那么即使不标注为 @FunctionalInterface, 编译器依 ...
随机推荐
- vue样式穿透
在一次这样的需求中,需要实现滑倒底部时自动请求数据,需要动态创建节点然后追加到某元素中,这期间遇到的问题就是在动态创建节点后,类名也已经加上了 ,但是样式就是没有生效,最后发现原因的产生竟然是< ...
- MYSQL 调优和使用必读
转载自:http://blog.eood.cn/mysql#rd?sukey=fc78a68049a14bb29c60f21c5254b15a1a9234459cf25ff467de14129ca11 ...
- AX内部公司
<object width="450" height="500" align="middle" id="reader&quo ...
- BZOJ4557 JLoi2016 侦察守卫 【树形DP】*
BZOJ4557 JLoi2016 侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是 ...
- BZOJ3687 简单题 【bitset】
BZOJ3687 简单题 Description 小呆开始研究集合论了,他提出了关于一个数集四个问题: 1.子集的异或和的算术和. 2.子集的异或和的异或和. 3.子集的算术和的算术和. 4.子集的算 ...
- TLS支持版本检测
今天有开发同事询问“生产环境的TLS版本是多少”,这个问题还真没太关注过,首先想到的是通过Chrome浏览器的开发者工具查看一下,访问https页面查看如下: 这太概是说使用了TLS1.2,于是截图给 ...
- 【angularJS】简介
简介 AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 指令 扩展了 HTML,且通过 表达式 绑 ...
- python动态给对象或者类添加方法
参考:http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object In Python, there is ...
- spring cloud feign 接口继承以及参数传递的问题
1. 优势 可以使用maven 进行访问,实现代码的共享,减少跨服务调用服务编写的问题 2. 使用 定义接口 publicinterfaceIUserService{ @Requ ...
- 1G1核1M选择 Centos 32位 还是 Centos 64位?
前几天有个疑惑,现有一台云主机是 1G1核1M使用 Centos 64位会不有点浪费. 还专门发信息询问老大 Karson,老大说现 FastAdmin 都是三个1,也是 64 位的. 看 FastA ...