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, 编译器依 ...
随机推荐
- clean-css 安装 使用
https://github.com/jakubpawlowicz/clean-css-cli https://davidwalsh.name/clean-css
- 在Golang中获取系统的磁盘空间内存占用
获取磁盘占用情况(Linux/Mac下有效) import ( "syscall" ) type DiskStatus struct { All uint64 `json:&quo ...
- Wireshark小技巧
抓头部: 时间格式设置: 自定义颜色: 快速过滤TCP/UDP: 过滤一个TCP/UDP Stream: 根据感兴趣内容生成表达式:如果右击的是Apply as Filter则生成表达式并自动执行
- PHP简单实例
<?php /** * @author admin * @copyright 2016 *编程实现2+4+6+…+100. * $sum = 0; for($i=2;$i<=100;$i+ ...
- linux远程win7教程
http://jingyan.baidu.com/article/c275f6bacd2227e33c756754.html 1 在ubuntu下搜索Remmina(超级方便,应该也可以控制linux ...
- ZOJ3640Help Me Escape(师傅逃亡系列•一)(数学期望||概率DP)
Background If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at ...
- thinkphp5 下 的Nginx 伪静态
server { listen 80; server_name all.bjed.com; root "F:\www\asdata"; location / { index ind ...
- 重温CLR(九) 接口
对于多继承(multiple inheritance)的概念,许多程序员并不陌生,他是指一个类从两个或多个基类派生的能力.例如,假定TransmitData类的作用是发送数据,ReceiveData类 ...
- Sprint第一个冲刺(第六天)
一.Sprint介绍 今天我们完成了修改注册和登录直接用滚轮选择,主界面加入轮播图 . 实验截图: 主界面加入轮播图: 任务进度: 二.Sprint周期 看板: 燃尽图:
- Oracle SQL七次提速技巧
以下SQL执行时间按序号递减. 1,动态SQL,没有绑定变量,每次执行都做硬解析操作,占用较大的共享池空间,若共享池空间不足,会导致其他SQL语句的解析信息被挤出共享池. create or repl ...