一些java lambda表达式的笔记

函数式编程

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值