前言

  目前我们知道java的版本已经发布到12了,之前的项目用的是JDK1.7,听说JDK1.8的改动相对来说大一些,因此抽空学学JDK1.8的一些新特性。本人也是通过阅读Java8实战这本书做一些小的总结,方便以后巩固,同时也为想学习Java1.8的人提供一些思路望大家多多包涵,有不对的地方请提出了我们一起学习。想要Java8实战这本书电子版的小伙伴可以留言告我可以发给你呦!

 演变过程

  这里我们通过一个简单的故事来引出神奇的Lambda。这里首先有一个苹果的实例,其包含简单的属性:颜色和重量。

 public class Apple {
private int weight = 0;
private String color = ""; public Apple(int weight, String color){
this.weight = weight;
this.color = color;
}
// get/set/toString
}

  首先我们要获取红色的苹果(因为红色的好吃嘛),这时候我们会定义一个简单的方法来进行过滤获取到红色的苹果。

     /**
* 筛选红苹果
* @param inventory
* @return
*/
public static List<Apple> filterRedApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>(); for (Apple apple: inventory){
if ("red".equals(apple.getColor())) {
result.add(apple);
}
} return result;
}

  后来由于苹果收购商有来了,我不管什么苹果,只要重量大于150g的统统给我装上车!好办啦!我们再加个方法来进行过滤就可以了。

    /**
* 筛选重量大于150的苹果
* @param inventory
* @return
*/
public static List<Apple> filterHeavyApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>(); for (Apple apple: inventory){
if (apple.getWeight() > 150) {
result.add(apple);
}
} return result;
}

  过了几天水果商又来了,我们现在想要绿色的苹果。这时候你可能想到是加一个方法 filterGreenApples 专门过滤绿色苹果,然而,如果要筛选多种颜色呢?黄色?暗红色?难道我们要每个新加一个方法吗?当然不是!我们最开始想到的是吧颜色作为参数传进去,试着将其抽象化。

     public static List<Apple> filterApplesByColor(List<Apple> inventory,
String color) {
List<Apple> result = new ArrayList<Apple>(); for (Apple apple: inventory){
if ( apple.getColor().equals(color) ) {
result.add(apple);
}
} return result;
}

  同时我们可能想到将获取重量的方法也进行优化

     public static List<Apple> filterApplesByWeight(List<Apple> inventory,
int weight) {
List<Apple> result = new ArrayList<Apple>(); for (Apple apple : inventory){
if ( apple.getWeight() > weight ){
result.add(apple);
}
} return result;
}

  这时候就很不错了,可(cao)爱(dan)的水果商又来了让我们提供一种方式来区分不同的属性进行过滤。OK! 我们进行优化!

     public static List<Apple> filterApples(List<Apple> inventory, String color,
int weight, boolean flag) {
List<Apple> result = new ArrayList<Apple>(); for (Apple apple: inventory){
if ( (flag && apple.getColor().equals(color)) ||
(!flag && apple.getWeight() > weight) ){
result.add(apple);
}
} return result;
}

  你会发现这个方法中的flag很难让人读懂。而且如果水果商想要再根据不同的属性进行过滤呢?比如产地、形状,那么这个方案就不能满足我们的需求了。

  那么我们如何应对这种多变的需求呢?让我们来定义一个接口对苹果过滤器进行建模。

 public interface AppleFilter {
boolean test(Apple apple);
}

  我们定义一个接口对苹果进行过滤,你可以定义多个实现类来选择不同的标准。

 public class AppleGreenColorFiler implements AppleFilter {
@Override
public boolean test(Apple apple) {
return "green".equals(apple.getColor());
}
} public class AppleHeavyWeightFilter implements AppleFilter {
@Override
public boolean test(Apple apple){
return apple.getWeight() > 150;
}
}

  这种实现方式类似与策略模式,我们可以将这种行为的实现作为一个参数传递进去。

     public static  List<Apple> filterApples(List<Apple> inventory, AppleFilter appleFilter) {
List<Apple> result = new ArrayList<Apple>(); for (Apple apple : inventory) {
if(appleFilter.test(apple)) {
result.add(apple);
}
} return result;
}

  这时候我们会发现我们的代码灵活很多了,可以应对水果商的各种需求了。而过滤的主要业务我们是在其实现类中进行定义的。我们甚至可以同时获取重量大于150并且是红色的苹果。

 public class AppleRedAndHeavyFilter implements AppleFilter {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor()) && apple.getWeight() > 150;
}
}

  这时候我们发现我们可以使用匿名内部类做代码的优化。并不需要每次都创建其实现类来完成。

 List<Apple> redApples = filterApples(inventory, new AppleFilter() {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor());
}
});

  那么在Java8中我们怎么做呢?看好啦!

 List<Apple> redApples = filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));

  这样的代码即简洁又容易读懂。

其他例子

  其实这样的写法可以针对很多地方,例如我们在使用Comparator对集合中的数据进行排序的时候,再比如使用Runnable创建线程的时候。这里就不再举例了,希望大家自己在下面试试这几种方式。

java8 学习之路之lambda的更多相关文章

  1. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  2. Java8学习笔记----Lambda表达式 (转)

    Java8学习笔记----Lambda表达式 天锦 2014-03-24 16:43:30 发表于:ATA之家       本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人 ...

  3. Java8学习(3)- Lambda 表达式

    猪脚:以下内容参考<Java 8 in Action> 本次学习内容: Lambda 基本模式 环绕执行模式 函数式接口,类型推断 方法引用 Lambda 复合 上一篇Java8学习(2) ...

  4. Android开发学习之路--RxAndroid之lambda

      RxJava的简单使用基本上也了解了,其实还有一个比较好玩的就是java8才有的lambda了. lambda在android studio下的环境搭建 下载java8   下面就来搭建下这个环境 ...

  5. JAVA8学习——深入浅出Lambda表达式(学习过程)

    JAVA8学习--深入浅出Lambda表达式(学习过程) lambda表达式: 我们为什么要用lambda表达式 在JAVA中,我们无法将函数作为参数传递给一个方法,也无法声明返回一个函数的方法. 在 ...

  6. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  7. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

  8. Java8学习笔记目录

    Java8学习笔记(一)--Lambda表达式 Java8学习笔记(二)--三个预定义函数接口 Java8学习笔记(三)--方法引入 Java8学习笔记(四)--接口增强 Java8学习笔记(五)-- ...

  9. [转]Spark学习之路 (三)Spark之RDD

    Spark学习之路 (三)Spark之RDD   https://www.cnblogs.com/qingyunzong/p/8899715.html 目录 一.RDD的概述 1.1 什么是RDD? ...

随机推荐

  1. day15(mysql 的多表查询,事务)

    mysql之多表查询 1.合并结果集 作用:合并结果集就是把两个select语句查询的结果连接到一起! /*创建表t1*/ CREATE TABLE t1( a INT PRIMARY KEY , b ...

  2. day06(Collection,List,ArrayList,LinkedList,iterator迭代器,增强for)

    Collection   接口    方法实现 boolean  add(Object o);//添加 boolean  remove(Object o);//移除 修改方法   让实现类自己去实现修 ...

  3. windows编程经典书籍

    本人是刚刚开始学习windows编程的,感觉看雪学院的大牛很NB.想找一些书籍来看学习学习,可是不知道看哪些书好.驱动,对菜鸟们来说真是一个很深奥的话题,所以 ,我找来了这篇文章供大家分享,以后大家发 ...

  4. 求解1^2+2^2+3^2+4^2+...+n^2的方法(求解1平方加2平方加3平方...加n平方的和)

    利用公式 (n-1)3 = n3 -3n2 +3n-1 设 S3 = 13 +23 +33 +43 +...+n3 及 S2 = 12 +22 +32 +42 +...+n2 及 S1 = 1 +2 ...

  5. [翻译] FastReport 格式化和突出显示

    一:格式化一个值 聚合函数的一个特征是,返回的数值没有格式化,如如下例子所示,它使用"SUM": 数据字段通常返回一个格式化的值,这是一个没有任何变化的"文本" ...

  6. StructureMap依赖注入

    IOC:控制反转,是一种设计模式.一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制:第二层是依赖注入:将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系.他们的依赖关系 ...

  7. DevExpress中Tile Application窗体的模型架构图

    DEV中Tile Application模型架构比较复杂,整理一下和大家分享. 图中:立体代表类:虚线椭圆代表属性.

  8. MS SQL 分页存储过程

    最近换了家新公司,但是新公司没有使用分页的存储过程.那我就自个写一个往项目上套 (效率怎么样就不怎么清楚没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pag ...

  9. dorado7-发布

    1.首先将configure.properties中Debug删除 2.eclipse自带的打包方式进行打包 2.1 next==>选择打包文件存放的路径==>finish==>xx ...

  10. WPF选择文件、文件夹和另存为对话框

    WPF提供了选择文件对话框,但并没有提供选择文件夹的对话框. OpenFileDialog类存在于PresentationFramework.dll程序集. public string SelectF ...