java8新特性1—— Lambda表达式来由

  • 一、lambda是什么?
  • 二、lambda的由来
    • 2.1 传统遍历
    • 2.2 行为参数化
    • 2.3 匿名内部类
    • 2.4 lambda表达式

天下熙熙皆为利来,天下攘攘皆为利往。

前不久刚刚看过《java8实战》这本书,现在将书中比较重要的知识点记录下来,因为脑子是个好东西,可惜,我不信任它。


一、lambda是什么?

正如’世界上唯一不变的就是变化’一样,java也需要一直迭代,保持活力。

lambda表达式也叫匿名函数

它是java从函数式编程语言借鉴,方便开发人员编写清晰、高效代码的一种编程风格。

java8中从函数式编程引入了两个核心思想:方法(方法引用)和lambda表达式可以作为值传递,并且函数或者方法可以有效、安全地并行执行。

二、lambda的由来

任何事物都不可能凭空产生,编程语言也是这样,lambda表达式也是不断发展变化而来的。

2.1 传统遍历

举个例子:我们有一个苹果对象,有颜色和重量两个属性,现在有一个苹果列表

public class Apple {private String color;private int weight;
}
List<Apple> apples = new ArrayList<Apple>();

需求一:筛选出列表中颜色为绿色的苹果,实现方法有很多,先看一种最普通的

 List<Apple> greenApples = new ArrayList<>();for (Apple apple : apples) {if ("green".equals(apple.getColor())) {greenApples.add(apple);}}

没毛病,这需求简单的跟1一样,那再来一个需求:给我把重量 > 500g 的筛选出来,我们也可以使用同样的方式去实现

 List<Apple> weightApples = new ArrayList<>();for (Apple apple : apples) {if (apple.getWeight() > 500) {weightApples.add(apple);}}

程序看起来没什么问题,但是很不优雅,基本上涉及属性筛选的操作都是重复性代码,而且对apples列表中所有的元素都进行遍历筛选,从效率上来讲也不值得推荐。

2.2 行为参数化

行为参数化,意味着你可以拿出一个代码块,把它准备好却不去执行它。这个代码块以后可以被你程序的其他部分调用,你可以推迟这块代码的执行。
行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。

在编程领域,抽象思维是很重要的,正如案例中所涉及的需求,我们也可以将那些需求抽取出来,将其抽象化为某一类型的动作,例如:filter(筛选)

代码如下:

public interface ApplePredicate {boolean filter(Apple apple);
}

行为参数化,结合案例具体来说,就是我们可以使用ApplePredicate的实现类作为参数,传递给某个具体的方法,比如筛选绿色苹果

// ApplePredicate实现类public class GreenApplePredicate implements ApplePredicate {@Overridepublic boolean filter(Apple apple) {return "green".equals(apple.getColor());}}
// Apple类中用来筛选属性的方法
// 根据属性筛选
// predicate参数可以是任何属性public static List<Apple> filter(List<Apple> apples, ApplePredicate predicate) {List<Apple> filterList = new ArrayList<>();for (Apple apple : apples) {if (predicate.filter(apple)) {filterList.add(apple);}}return filterList;}
  List<Apple> filter = Apple.filter(apples, new GreenApplePredicate());

我们需要给filter方法传递ApplePredicate对象,对Apple做条件测试,这就是行为参数化。

filter方法的行为取决于我们通过ApplePredicate对象传递的代码。换句话说,我们把filter方法的行为参数化了!

2.3 匿名内部类

刚刚我们实现了ApplePredicate接口,其实现类GreenApplePredicate具备筛选绿色苹果的功能,如果我要按重量筛选,按品种、按价格筛选呢?也要先写个实现类吗?
不好意思,我比较懒,我一百个不愿意。

这个时候匿名内部类就派上用场了,正如其名,匿名内部类也是一个类,它也是被类加载器加载的,会有对应的class文件,只不过是没有自己的名字而已。

现在我们改进一下我们刚刚的代码,还是筛选绿色苹果,这次我们使用匿名内部类。

List<Apple> filter = Apple.filter(apples, new ApplePredicate() {@Overridepublic boolean filter(Apple apple) {return "green".equals(apple.getColor());}});

看起来不错,但是匿名内部类有它不足的地方,首先它有些笨重,因为它占用了很多空间,其次太过啰嗦了,代码可读性也不够好。
于是,为了解决这个问题,lambda表达式诞生了。
需要注意的是,就执行效率而言,二者不分伯仲。

2.4 lambda表达式

让我们看看lambda表达式如何实现筛选过滤绿色苹果

List<Apple> filter = Apple.filter(apples, (Apple apple) -> "green".equals(apple.getColor()));

不得不承认这代码看上去比先前干净很多。这很好,因为它看起来更像问题陈述本身了。我们现在已经解决了啰嗦的问题。

这就是lambda表达式的由来。

小结:

java8新特性—— Lambda来由相关推荐

  1. Java8新特性----Lambda表达式详细探讨

    Java8新特性 Lambda表达式 入门演示 案例1 如何解决 cannot be cast to java.lang.Comparable问题? 案例2 优化方式一 : 策略设计模式 优化方式二: ...

  2. Java8新特性 Lambda、Stream、Optional实现原理

    Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...

  3. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  4. java8新特性-lambda表达式入门学习

    定义 jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expressi ...

  5. Java8新特性——lambda表达式

    什么是lambda表达式? Lambda 表达式是Java 8 的新特性,是一种新的编程语法.lambda语义简洁明了,性能良好,是Java 8 的一大亮点.废话不多说,我们来看个例子. 从内部类到l ...

  6. java8新特性lambda表达式概述

    定义 ​ jdk8发布新特性中,lambda是一大亮点之一.lambda表达式能够简化我们对数据的操作,减少代码量,大大提升我们的开发效率.Lambda 表达式"(lambda expres ...

  7. java8新特性Lambda和Stream以及函数式接口等新特性介绍

    主要内容 1.Lambda 表达式 2.函数式接口 3.方法引用与构造器引用 4.Stream API 5.接口中的默认方法与静态方法 6.新时间日期API 7.其他新特性 Java 8新特性简介 速 ...

  8. 2020.10.20课堂笔记(java8新特性 lambda表达式)

    一.什么是Lambda? 我们知道,对于一个Java变量,我们可以赋给其一个"值". 如果你想把"一块代码"赋给一个Java变量,应该怎么做呢? 比如,我想把右 ...

  9. fundamentals\java\java8新特性-Lambda(译自oracle官网)

    Java8 Lambda Expressions 目录 Java8 Lambda Expression 典型使用场景:Ideal Use Case for Lambda Expressions 问题提 ...

  10. java8新特性-lambda表达式和stream API的简单使用

    一.为什么使用lambda Lambda 是一个 匿名函数,我们可以把 Lambda表达式理解为是 一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风 ...

最新文章

  1. 全桥整流等效负载阻抗是多少?
  2. _CRT_SECURE_NO_WARNINGS错误提示,解决办法
  3. php mysql建表_mysql建表测试
  4. 【Android】 Android中Log调试详解
  5. python读取hdf5文件_科学网—python读hdf5文件 - 钱磊的博文
  6. kafka分区分配策略
  7. python中stripped string_【Python爬虫学习笔记(3)】Beautiful Soup库相关知识点总结
  8. momentjs 使用总结
  9. cad计算机画图标准,CAD画图某些常用尺寸及作图习惯
  10. PLSQL 导出、导入 表和数据
  11. 计算机体检作用,QQ电脑管家什么是电脑体检?有什么作用?
  12. 阿里P6、P7、P8级别需要多少年工作经验?
  13. 任正非:宁赔10亿,也要辞退7000员工!华为卸磨杀驴?却获网友点赞!
  14. php memcache内存大小,PHP memcache 内存缓存 数据库查询 应用 高洛峰 细说PHP
  15. win10安装消息队列服务器,win10下celery搭建使用
  16. idea IntelliJ IDEA 2018.2.5 x64 破解
  17. 向量代数与空间解析几何
  18. 如何使用HTML进行一个简单的图文混排
  19. 华为鸿蒙harmonyos面相全场,关于华为:HDC2020华为鸿蒙HarmonyOS会带来哪些不一样的体验...
  20. 计算机怎么模拟对弈,剑网3指尖对弈怎么在电脑上玩 用模拟器玩剑网3指尖对弈电脑版...

热门文章

  1. [codeup 2132] Repair the Wall
  2. TensorFlow 强化学习快速入门 -- Kaushik Balakrishnan 读后感
  3. 翻译:Swift中的Operations和OperationQueues入门
  4. linux编程基础系统,Linux编程基础
  5. C++ string append方法的常用用法
  6. No module named ‘wrapt‘
  7. debian rabbitmq离线安装_Rabbitmq web-mqtt在debian上的安装
  8. 矩阵分析(三):矩阵的列空间、行空间与零空间
  9. 数据分析中会常犯哪些错误,如何解决? 五
  10. FaceBoundingBoxInInfraredSpace 得到的深度空间的数值为空