Java8函数式编程和lambda表达式
文章目录
函数式编程
JDK8接口新特性
函数接口
方法引用
函数式编程
函数式编程更多时候是一种编程的思维方式,是一种方法论。函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做。简单说,函数式编程是基于某种语法或调用API去进行编程。
例如,从整型数组中找出最小的那个数字,采用命令式编程实现如下:
public static void main(String[] args){
int[] array={1,2,3,4,5,6,7,8,9,10};
int minx=Integer.MAX_VALUE;
for(int a:array){
if(a<minx)
minx=a;
}
System.out.println(minx);
}
1
2
3
4
5
6
7
8
9
10
而采用函数式编程来实现,则简化为如下代码:
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int minx = IntStream.of(array).min().getAsInt();
System.out.println(minx);
1
2
3
4
我们可以看出,命令式编程需要自己实现具体逻辑,而函数式编程则是调用API完成需要,将命令式的代码写成一系列函数调用,在函数式编程下代码更简洁、易懂,这也就是为什么要使用函数式编程的原因之一。所以才说函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做,这是一种思维的转变。
而lambda表达式作为函数式编程的基础,也就显得十分重要:
在Java不支持lambda表达式的时候,我们会去这样创建一个线程:
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("run()方法");
}
}).start();
1
2
3
4
5
6
7
而采用lambda表达式:
new Thread(() -> System.out.println("run()")).start();
1
lambda表达式一句话即完成线程的创建,它强调了函数的输入输出,而隐藏了内部实现细节,并且可以接收函数作为输入(参数)和输出(返回值).
在->的左边是输入,右边是输出.上述代码参数为空。
该lambda表达式的作用就是返回了Runnable接口的实现对象,这调用某个方法获取实例对象类似,只不过是将实现代码直接写进了lambda表达式中.
JDK8接口新特性
函数接口,接口只能有一个需要实现的方法,可以使用FunctionalInterface注解进行声明
@FunctionalInterface
public interface InterfaceOne {
int doubleNum(int i);
}
1
2
3
4
使用lambda表达式获取该接口的实现实例的几种写法:
InterfaceOne num1 = (i) -> i * 2;
System.out.println(num1.doubleNum(10));
InterfaceOne num2 = i -> i * 2;
// 指定参数类型
InterfaceOne num3 = (int i) -> i * 2;
InterfaceOne num4 = (int i) -> {
System.out.println(i);
return i * 2;
};
1
2
3
4
5
6
7
8
9
10
11
12
接口的默认方法,用于提供默认实现。默认方法和普通实现类的方法一样,可以使用this关键字。
@FunctionalInterface
public interface InterfaceOne {
int doubleNum(int i);
}
default int add(int x,int y){
return x+y;
}
1
2
3
4
5
6
7
8
之所以说默认方法这个特性比较重要,是因为我们借助这个特性可以在以前所编写的一些接口上提供默认实现,并且不会影响任何的实现类以及既有的代码。例如我们最熟悉的List接口,在JDK1.2以来List接口就没有改动过任何代码,到了1.8之后才使用这个新特性增加了一些默认实现。这是因为如果没有默认方法的特性的话,修改接口代码带来的影响是巨大的,而有了默认方法后,增加默认实现可以不影响任何的代码。
当接口多重继承时,可能会发生默认方法覆盖的问题,这时要指定使用哪一个接口的默认方法实现。
-------------
Java8函数式编程和lambda表达式的更多相关文章
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- Java 函数式编程(Lambda表达式)与Stream API
1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...
- Java 函数式编程和Lambda表达式
1.Java 8最重要的新特性 Lambda表达式.接口改进(默认方法)和批数据处理. 2.函数式编程 本质上来说,编程关注两个维度:数据和数据上的操作. 面向对象的编程泛型强调让操作围绕数据,这样可 ...
- Java8函数式接口以及lambda表达式实践
罗列一下遇到可以转换成lamada表达式的场景,仅供参考,如有更好的方式,欢迎在评论区留言. 1.计算订单总金额 订单总金额一般是在后台循环叠加每个购买商品的金额已获取到,通常的方式如下 BigDec ...
- Python函数式编程:Lambda表达式
首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如 a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...
- C# 函数式编程 —— 使用 Lambda 表达式编写递归函数
最近看了赵姐夫的这篇博客http://blog.zhaojie.me/2009/08/recursive-lambda-expressions.html,主要讲的是如何使用 Lambda 编写递归函数 ...
- 函数式编程--使用lambda表达式
前面一篇博客我们已经说到了,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例.现在我们来写一段java的命令者模式来自己研究下lambda表达式的语法. 这里重复下命令者模式: ...
- Java函数式编程和lambda表达式
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...
- Java8函数式接口和Lambda表达式
两者关系: Lambda表达式就是函数式接口(FunctionalInterface)实现的快捷方式,它相当于函数式接口实现的实例,因为在方法中可以使用Object作为参数,所以把Lambda表达式作 ...
随机推荐
- MyBatis相关资源
MyBatis很多项目中有用到,但会用并不表示你真正理解它,更不代表你能很清楚的教会别人.如果想在会用它的基础上更深入的通过学习它而提升自己技术能力,可利用下面资源. 1.官网文档,基本概念讲的很清楚 ...
- 洛谷P4316绿豆蛙的归宿——期望
题目:https://www.luogu.org/problemnew/show/P4316 期望水题,从终点向起点推,因为是DAG,所以拓扑序推过去即可. 代码如下: #include<ios ...
- .NET Core 3.0之深入源码理解Configuration(二)
文件型配置基本内容 上一篇文章讨论了Configuration的几个核心对象,本文继续讨论Configuration中关于文件型配置的相关内容.相比较而言,文件型配置的使用场景更加广泛,用户自定义 ...
- Codeforces - Gym102028 - 2018 Jiaozuo Regional Contest
http://codeforces.com/gym/102028 A. Xu Xiake in Henan Province 看起来像水题.乱搞一下,还真是. #include<bits/std ...
- (水题)洛谷 - P2089 - 烤鸡
https://www.luogu.org/problemnew/show/P2089 非常暴力的dfs,不知道不剪枝会怎么样,但是其实最多也就 $3^{10}$ ,大不到哪里去.还有一个细节就是大于 ...
- 51nod 1051 最大子矩阵和(DP)
题意 略 分析 一道经典的DP题,但是我弱到差点做不出来,真的垃圾 设置\(sum(i,j)代表1-i行第j列的前缀和\),然后枚举行i和行j,再枚举列k,做一遍类似一维的最大子段和即可 #inclu ...
- bzoj 1058: [ZJOI2007]报表统计【set】
我想写FHQtreap的!是set自己跑进代码的!因为太好写了 是有点慢--洛谷上不吸氧会T一个点 就是,用一个set p维护所有点值,ans维护MIN_SORT_GAP的答案,每次insert一个点 ...
- YCOJ单向公路
题目: 描述 某地区有许多城镇,但并不是每个城镇都跟其他城镇有公路连接,并且有的公路并不能双向行驶.现在我们把这些城镇间的公路分布及允许的行驶方向告诉你,你需要编程解决通过公路是否可以从一个城镇到达另 ...
- Mantis优化改造(功能篇)
共分为两篇,功能篇和技术篇. 时间大约是2016年冬天. 考虑搭一个用于Bug管理和追踪的系统. 综合比较下,选择了小巧的开源工具,Mantis. 在源码基础上,做代码修改,完成了定制版的优化改造. ...
- web.xml报错:Invalid content was found starting with element 'init-param'
问题与分析 在web.xml中配置servlet节点时报错如下: cvc-complex-type.2.4.a: Invalid content was found starting with ele ...