项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8
之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。

1.替代匿名内部类

毫无疑问,lambda表达式用得最多的场合就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类!请看代码:

如果使用匿名内部类:

    @Testpublic void oldRunable() {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("The old runable now is using!");}}).start();}

而如果使用lambda表达式:

    @Testpublic void runable() {new Thread(() -> System.out.println("It's a lambda function!")).start();}

最后的输出:

The old runable now is using!
It's a lambda function!

是不是强大到可怕?是不是简单到可怕?是不是清晰明了重点突出到可怕?这就是lambda表达式的可怕之处,用极少的代码完成了之前一个类做的事情!

2.使用lambda表达式对集合进行迭代

Java的集合类是日常开发中经常用到的,甚至说没有哪个java代码中没有使用到集合类。。。而对集合类最常见的操作就是进行迭代遍历了。请看对比:

    @Testpublic void iterTest() {List<String> languages = Arrays.asList("java","scala","python");//before java8for(String each:languages) {System.out.println(each);}//after java8languages.forEach(x -> System.out.println(x));languages.forEach(System.out::println);}

如果熟悉scala的同学,肯定对forEach不陌生。它可以迭代集合中所有的对象,并且将lambda表达式带入其中。

languages.forEach(System.out::println);

这一行看起来有点像c++里面作用域解析的写法,在这里也是可以的。

3.用lambda表达式实现map

一提到函数式编程,一提到lambda表达式,怎么能不提map。。。没错,java8肯定也是支持的。请看示例代码:

    @Testpublic void mapTest() {List<Double> cost = Arrays.asList(10.0, 20.0,30.0);cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));}

最后的输出结果:

10.5
21.0
31.5

map函数可以说是函数式编程里最重要的一个方法了。map的作用是将一个对象变换为另外一个。在我们的例子中,就是通过map方法将cost增加了0,05倍的大小然后输出。

4.用lambda表达式实现map与reduce

既然提到了map,又怎能不提到reduce。reduce与map一样,也是函数式编程里最重要的几个方法之一。。。map的作用是将一个对象变为另外一个,而reduce实现的则是将所有值合并为一个,请看:

    @Testpublic void mapReduceTest() {List<Double> cost = Arrays.asList(10.0, 20.0,30.0);double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();System.out.println(allCost);}

最终的结果为:

63.0

如果我们用for循环来做这件事情:

    @Testpublic void sumTest() {List<Double> cost = Arrays.asList(10.0, 20.0,30.0);double sum = 0;for(double each:cost) {each += each * 0.05;sum += each;}System.out.println(sum);}

相信用map+reduce+lambda表达式的写法高出不止一个level。

5.filter操作

filter也是我们经常使用的一个操作。在操作集合的时候,经常需要从原始的集合中过滤掉一部分元素。

    @Testpublic void filterTest() {List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());filteredCost.forEach(x -> System.out.println(x));}

最后的结果:

30.0
40.0

将java写出了python或者scala的感觉有没有!是不是帅到爆!

6.与函数式接口Predicate配合

除了在语言层面支持函数式编程风格,Java 8也添加了一个包,叫做 java.util.function。它包含了很多类,用来支持Java的函数式编程。其中一个便是Predicate,使用 java.util.function.Predicate 函数式接口以及lambda表达式,可以向API方法添加逻辑,用更少的代码支持更多的动态行为。Predicate接口非常适用于做过滤。

    public static void filterTest(List<String> languages, Predicate<String> condition) {languages.stream().filter(x -> condition.test(x)).forEach(x -> System.out.println(x + " "));}public static void main(String[] args) {List<String> languages = Arrays.asList("Java","Python","scala","Shell","R");System.out.println("Language starts with J: ");filterTest(languages,x -> x.startsWith("J"));System.out.println("\nLanguage ends with a: ");filterTest(languages,x -> x.endsWith("a"));System.out.println("\nAll languages: ");filterTest(languages,x -> true);System.out.println("\nNo languages: ");filterTest(languages,x -> false);System.out.println("\nLanguage length bigger three: ");filterTest(languages,x -> x.length() > 4);}

最后的输出结果:

Language starts with J:
Java Language ends with a:
Java
scala All languages:
Java
Python
scala
Shell
R No languages: Language length bigger three:
Python
scala
Shell 

可以看到,Stream API的过滤方法也接受一个Predicate,这意味着可以将我们定制的 filter() 方法替换成写在里面的内联代码,这也是lambda表达式的魔力!

参考文档:
1.http://www.importnew.com/16436.html

java8 手把手教你学会写lambda表达式相关推荐

  1. 优化| 手把手教你学会杉树求解器(COPT)的安装、配置与测试

    优化| 手把手教你学会杉数求解器COPT的安装.配置与测试 前言 线性规划(LP)测试榜单--单纯形法: Benchmark of Simplex LP solvers 线性规划(LP)测试榜单--内 ...

  2. mysql插入栏位语句_情人节福利,手把手教你学会mysql语句操作

    情人节福利,手把手教你学会mysql语句操作 一起来 日常学python 进入正题 mysql语句分为两种,一种是DDL,就是数据定义语句,比如那些CREATE,ALTER.另一种是DML,就是数据管 ...

  3. 不求人,手把手教你学会微信WIFI!

    前言:好吧,这是作者开博的第一篇文章,在如今朋友圈文章泛滥的时代,再看过了那么多"心灵鸡汤"."技术神贴"之后,作者也在思考,自己能不能写点什么,也许过上一百年 ...

  4. java8新特性(1)--- lambda表达式

    java8新特性(1)- lambda表达式 函数式编程,简化开发 新增语法(->) package com.common.jdk8;// 试想,如果在jdk1.7中,我们要实现基于这个接口的加 ...

  5. 华为手机如何固定横屏_华为手机如何录屏?原来方法这么简单,手把手教你学会...

    很多人都不知道,华为手机到底如何录屏,下面给大家分享4种方法,非常简单,手把手教你学会. 一.通知栏录屏 从手机顶端往下滑动打开通知栏,这个面板上有很多快捷功能,其中就有[屏幕录制]功能,点击开始录屏 ...

  6. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  7. html 插入 排班表,怎么用Word制作排班表,手把手教你学会

    原标题:怎么用Word制作排班表,手把手教你学会 在工作中,或者是在生活中,人们听到排班表的时候,一点也不会感觉惊讶,因为这是在工作中的需要,日常的工作都会有班次的安排,根据不同的情况给每个人安排不同 ...

  8. 手把手教你学会EDIUS剪辑软件视频教程

    手把手教你学会EDIUS剪辑软件视频教程 课程目标: 用最短的时间教会你掌握最实用的EDIUS剪辑技! 最近迷上了这堂课.老师讲的很好!建议不会想学的朋友可以向林杉老师学习,讲的比较仔细.赞一个!!! ...

  9. 学习笔记之-java8的新特性-函数式接口,lambda表达式,方法引用,Stream API,Optional类

    1.Lambda表达式 用匿名内部类的方法去创建多线程1.new Thread2.参数传递new Runnable3.重写run方法4.在run方法中去设置线程任务5.调用start问题:我们最终目标 ...

最新文章

  1. 多线程模式(2):Guarded Suspension模式
  2. html表格立体效果,用HTML实现凸(凹)起的立体效果的表格
  3. 基于tcpdump的Android智能移动终端数据包捕获完整解决方案
  4. lm80认证_中国能效标识GB30255、GB38450和GB37478认证要求讲解
  5. python巡检脚本juniper_JUNIPER设备日常维护巡检命令
  6. Tcp Keepalive和HTTP Keepalive详解
  7. 文献记录(part51)--识别聚类间远近关系的双几何体模型
  8. PSASP7.61版本,求新能源的算例
  9. php中文九九乘法表,PHP输出九九乘法表代码实例
  10. 教师评语计算机实验报告作业,作业实验报告评语大全
  11. uva10098--排列
  12. web端第三方微信登录
  13. Java| MANIFEST.MF讲解
  14. 免费在线使用微软文字转语音工具(附详细转换步骤)
  15. 一辈子不用考试?你可能是个假程序员
  16. MT6(8)735平台Android5.1 codege.dws 配置
  17. 华为手机显示切换服务器,手机切换云服务器
  18. 软件开发人员的作战手册 - 让程序员活的久一点
  19. 中软国际面试题及答案
  20. git安装问题解决方案

热门文章

  1. 10个Spring Boot快速开发的项目,接私活利器(快速、高效)
  2. 基于BP神经网络的非线性函数拟合(一维高斯函数)研究-含Matlab代码
  3. 人际交往能力远比你想象的重要
  4. dcm4che源码编译build异常
  5. 电脑蓝屏了怎么解决? 旧时光 oldtimeblog
  6. Ubuntu22.04安装ros(一键搞定)
  7. 仿百度文库、豆丁文档网站源码在线文档分享系统最新版+带全套工具
  8. 【内网学习笔记】5、BloodHound 的使用
  9. 《深度学习》 之 AlexNet卷积神经网络 原理 详解
  10. Camunda 创建 流程图 (二)