一些java lambda表达式的笔记
来源:互联网 发布:Mac怎样设置快捷键 编辑:程序博客网 时间:2024/06/10 04:40
函数式编程
http://www.open-open.com/lib/view/open1430532743068.html
引用来源
开始
在练习java并发编程的时候IDE出现了一个很有趣的提示:创建线程并调用run()方法时可以使用lambda表达式。
//Before Java 8:
new
Thread(
new
Runnable() {
@Override
public
void
run() {
System.out.println(
"Before Java8 "
);
}
}).start();
//Java 8 way:
new
Thread(() -> System.out.println(
"In Java8!"
));
这是啥?好像之前在Java的书里面听说过这个东西,但是从来没有用过。按照IDE的建议,按下“修改”。原本复杂的代码一下子变成了自己看不懂的模样:
呃,run()方法呢?
run()方法跑到那个花括号里面去了吧。那么那个花括号之前的空白括号是什么意思?那个像是链表指针的箭头又是什么意思?
回顾
其实,lambda表达式只不过是函数式编程的一种形式,其中Java8支持的lambda表达式是其中一种规定的写法而已。那么什么是函数式编程呢?与其相对的是命令式编程。我们对命令电脑“新建一个变量”,“把变量值设为2”,“将这两个变量相加,把结果放到另外一个变量里”已经习以为常了。在函数式编程思想中,只有函数,没有变量。函数作为参数,函数作为一切。程序就是一个函数嵌套另一个函数,最终组成一个超级大的函数:输出只和输入有关。虽然按照这样的思想,有一些问题比如状态记录,临时变量等产生,但是现在已经有对应的解决方法。到头来主流的编程语言都或多或少支持函数式编程的一些特性,Java的lambda表达式支持也是一种。
记得斐波那契数列吗?它的特点是每一项的值等于前两项之和。如果是一个命令式编程思想指导下的计算斐波那契数列第n项的函数,那么它应该是这样的:
int
fib(
int
n){
int
a,b,temp=
0
;
if
(n==
2
||n==
1
){
return
1
;
}
for
(
int
i=
1
;i<=n-
2
;i++){
a=i;
b=i+
1
;
temp=a+b;
}
return
temp;
}
执行一次fib()方法,其中有一个不断循环的for语句,直到找到正确的结果后输出。从逻辑上来说,这个代码块的确是在“计算第n项的斐波那契数”,并且输出了结果。
可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:
int
fib(
int
n){
if
(n==
2
||n==
1
){
return
1
;
}
return
fib(n-
1
)+fib(n-
2
);
}
简洁哭了好吗?虽然迭代调用本身函数不见得性能更好,但是这代码一目了然,根本不需要设置什么变量来存中间值,每一步算出的结果直接丢到下一次迭代的参数里去。
lambda表达式
一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。
List<Double> salary = Arrays.asList(
500.0
,
500.0
,
600.0
,
1000.0
,
200.0
,
300.0
,
660.0
,
250.0
);
double
bill=salary.stream().map((sala)->sala+.
55
*sala).reduce((sum,sala)->sum+sala).get();
System.out.println(bill);
在这个lambda表达式例子里,首先定义的是一个存放一组double类型数据的List。我们想知道对这组数据每个数据乘以0.55以后的值之和。使用新增的Stream API能够又快又好地处理集合中的数据。
定义第二个double类型变量用于存放总值:使用stream().map()方法使用lambda表达式,可以看到map()的参数里大概是()->()这种形式。这里头的“sala”是随手打的一个临时变量,完全不需要声明,Java根据上下文就懂了这应该是一个double类型。(如果不说明salary是<Double>类型的话,这个sala会被当成Object类的)
stream()也顾名思义是salary里一组double变量挨个儿进行map()中的操作了。这个操作看起来很陌生,其实类似"sala=sala+.55*sala",或者类似一个循环,循环里对每个salary元素进行这个运算操作。然后调用reduce()方法,告诉它将八个结果累加,然后get()到bill变量里,输出bill。
函数式编程
http://www.open-open.com/lib/view/open1430532743068.html
引用来源
开始
在练习java并发编程的时候IDE出现了一个很有趣的提示:创建线程并调用run()方法时可以使用lambda表达式。
//Before Java 8:
new
Thread(
new
Runnable() {
@Override
public
void
run() {
System.out.println(
"Before Java8 "
);
}
}).start();
//Java 8 way:
new
Thread(() -> System.out.println(
"In Java8!"
));
这是啥?好像之前在Java的书里面听说过这个东西,但是从来没有用过。按照IDE的建议,按下“修改”。原本复杂的代码一下子变成了自己看不懂的模样:
呃,run()方法呢?
run()方法跑到那个花括号里面去了吧。那么那个花括号之前的空白括号是什么意思?那个像是链表指针的箭头又是什么意思?
回顾
其实,lambda表达式只不过是函数式编程的一种形式,其中Java8支持的lambda表达式是其中一种规定的写法而已。那么什么是函数式编程呢?与其相对的是命令式编程。我们对命令电脑“新建一个变量”,“把变量值设为2”,“将这两个变量相加,把结果放到另外一个变量里”已经习以为常了。在函数式编程思想中,只有函数,没有变量。函数作为参数,函数作为一切。程序就是一个函数嵌套另一个函数,最终组成一个超级大的函数:输出只和输入有关。虽然按照这样的思想,有一些问题比如状态记录,临时变量等产生,但是现在已经有对应的解决方法。到头来主流的编程语言都或多或少支持函数式编程的一些特性,Java的lambda表达式支持也是一种。
记得斐波那契数列吗?它的特点是每一项的值等于前两项之和。如果是一个命令式编程思想指导下的计算斐波那契数列第n项的函数,那么它应该是这样的:
int
fib(
int
n){
int
a,b,temp=
0
;
if
(n==
2
||n==
1
){
return
1
;
}
for
(
int
i=
1
;i<=n-
2
;i++){
a=i;
b=i+
1
;
temp=a+b;
}
return
temp;
}
执行一次fib()方法,其中有一个不断循环的for语句,直到找到正确的结果后输出。从逻辑上来说,这个代码块的确是在“计算第n项的斐波那契数”,并且输出了结果。
可是按照人的思考方式,并不是这样。人一般以一种迭代的方式计算出第n项的斐波那契数。例如:
int
fib(
int
n){
if
(n==
2
||n==
1
){
return
1
;
}
return
fib(n-
1
)+fib(n-
2
);
}
简洁哭了好吗?虽然迭代调用本身函数不见得性能更好,但是这代码一目了然,根本不需要设置什么变量来存中间值,每一步算出的结果直接丢到下一次迭代的参数里去。
lambda表达式
一般被用在“我觉得这里应该用一个函数来实现xx功能,但是其他地方又不会再用到这个功能”的情况下。在Java8里用来代替鶸的匿名函数。
List<Double> salary = Arrays.asList(
500.0
,
500.0
,
600.0
,
1000.0
,
200.0
,
300.0
,
660.0
,
250.0
);
double
bill=salary.stream().map((sala)->sala+.
55
*sala).reduce((sum,sala)->sum+sala).get();
System.out.println(bill);
在这个lambda表达式例子里,首先定义的是一个存放一组double类型数据的List。我们想知道对这组数据每个数据乘以0.55以后的值之和。使用新增的Stream API能够又快又好地处理集合中的数据。
定义第二个double类型变量用于存放总值:使用stream().map()方法使用lambda表达式,可以看到map()的参数里大概是()->()这种形式。这里头的“sala”是随手打的一个临时变量,完全不需要声明,Java根据上下文就懂了这应该是一个double类型。(如果不说明salary是<Double>类型的话,这个sala会被当成Object类的)
stream()也顾名思义是salary里一组double变量挨个儿进行map()中的操作了。这个操作看起来很陌生,其实类似"sala=sala+.55*sala",或者类似一个循环,循环里对每个salary元素进行这个运算操作。然后调用reduce()方法,告诉它将八个结果累加,然后get()到bill变量里,输出bill。
- 一些java lambda表达式的笔记
- lambda表达式的学习笔记
- 《写给大忙人看的java SE8》笔记 -- 1. lambda表达式
- Java lambda表达式的应用
- JAVA lambda表达式的实例
- Java lambda 表达式的基础知识
- java8 Lambda表达式的一些特点
- java lambda表达式 闭包学习笔记
- Java学习笔记——Lambda表达式
- lambda表达式的学习笔记一
- JAVA 8 StreamAPI 和 lambda表达式 总结(四)--stream的一些聚合操作
- Java SE8 Lambda 基础入门---lambda表达式的类型是什么
- Lambda表达式学习笔记
- c++ lambda表达式笔记
- java中Lambda表达式的用法
- Java Lambda 表达式的奇幻之旅
- 理解JAVA 8的Lambda表达式
- Java中Lambda表达式的使用
- 百度地图bug
- TextInputLayout 的使用
- discuz 与YII 的同步登录
- vmwre 桥模式上网, 虚拟机作为一个独立的局域网电脑
- 学习分隔String的应用类 StringTokenizer
- 一些java lambda表达式的笔记
- Leetcode 415. Add Strings 字符串加法 解题报告
- Java ArrayList删除特定元素的方法
- 图像滤镜艺术----Brannan滤镜
- KVO的基本使用
- linux关闭启动防火墙
- 使用MVC模型的用户登录及注册(注销部分)
- Fresco简单使用
- Jersey客户端API调用REST风格的Web服务