从java7到java8,最主要的变化可以总结为

□Lambda表达式

□ 方法引用

□流和默认方法

让我们通过一个小例子感受一下

情景 1 集合对象排序 (对list中的苹果按照重量排序)

  1. Collections.sort(list,new Comparator<Apple>(){
  2.    public
    int compare(Apple a1,Apple a2){
  3.       return a1.getWeight()-a2.getWeight();
  4.    }
  5. });

在java8里面,这种实现只需要一行很简短的代码

  1. list.sort(java.util.Comparator.comparing(Apple::getWeight))

这其中涉及到lambda表达式,接口中静态方法,方法引用等java8新特性,而且一看就明白其功能,给list排序,排序依据weight

Java多线程历程 java1.0 线程和锁------à java5 线程池和并发集合----------à java7 添加分支/合并(fork/join)--à java8 添加stream支持并发处理数据

在java8中加入Streams可以把 接口默认方法和把代码块传递给方法的简介方式(方法引用、lambda表达式)

把代码传递给方法 即是一种行为参数化思想,和函数式编程思想极为相近。

情景2 对目录文件过滤,筛选所有隐藏文件

  1. File [] hiddenFiles=new File(".").listFiles(new FileFilter(){
  2.    public boolean accept(File file){
  3.       return file.isHidden();
  4.    }
  5. });

使用方法引用,直接将方法当做参数传递进去

  1. File [] hiddenFiles=new File(".").listFiles(File::isHidden)

既然对象File已经有了一个isHidden方法,我们不必再把它包含在啰嗦的匿名内部类里面过滤了。

与用对象引用(对象引用是用new创建的)类似,写下File::isHidden就创建一个方法引用,可以传递它

如可以写成这样

  1. FileFilter filter=File::isHidden;
  2. File [] isHiddenFiles2=new File(".").listFiles(filter);

从第一行代码可以看出,方法引用确实可以当做一个变量来使用

 

情景3 lambda传递条件代码 (筛选符合条件的苹果)

  1. public static List<Apple> filterGreenApple(List<Apple> list){
  2.  
  3.    List<Apple> result=new ArrayLst<>();
  4.    for(Apple apple : list){
  5.       if("green".equals(apple.getColor())){
  6.          result.add(apple); //筛选颜色为绿色的苹果
  7.       }
  8.    }
  9.    return result;
  10. }
  11. public static List<Apple> filterWeighterApple(List<Apple> list){
  12.  
  13.    List<Apple> result=new ArrayLst<>();
  14.    for(Apple apple : list){
  15.       if(apple.getWeight()>150){
  16.          result.add(apple); //筛选重量大于150g的苹果
  17.       }
  18.    }
  19.    return result;
  20. }

如果客户要筛选红苹果,筛选红且重量大于150g的苹果,…难道每次都要添加一个函数吗,而且这些函数除了条件筛选不一样,其他部分都是一样的。

首先我们可以把公用代码提出来

  1. public static List<Apple> filterApple(List<Apple> list){
  2.    List<Apple> result=new ArrayList<>();
  3.    for(Apple apple:list){
  4.       if(....){ //苹果筛选条件
  5.          result.add(apple);
  6.       }
  7.    }
  8.    return result;
  9. }
  10. 进一步,我们可以把筛选条件传递进去
    过滤函数可以改成这样
  11. public static List<Apple> filterApple(List<Apple> list,Predicate<Apple> p){
  12.    List<Apple> result=new ArrayList<>();
  13.    for(Apple apple:list){
  14.       if(p.test(apple)){
  15.          result.add(apple);
  16.       }
  17.    }
  18.    return result;
  19. }
  20. Public interface Predicate<Apple>{
  21.     Boolean test(Apple apple);
  22. }

即过滤函数有两个参数,一个时过滤的对象集合,一个时过滤的 条件对象(Predicate),而该条件对象应该有个可以返回Boolean的函数来确定是否符合条件(策略设计模式)

这样设计之后,把filterApple方法迭代集合的逻辑和要应用到集合中每个元素对象上的行为(谓词)区分开了。

比如要筛选出绿苹果

  1. public class GreenColorPredicate<Apple> implements Predicate<Apple>{
  2.    public boolean test(Apple apple){
  3.       if("green".equals(apple.getColor())){
  4.          return true;
  5.       }
  6.       return false;
  7.    }
  8. }
  9. GreenColorPredicate<Apple> greenPredicate=new GreenColorPredicate<>();
  10. filterApple(list,greenPredicate);

 

或者lambda表达式

  1. filterApple(list,(Apple apple)->"green".equals(apple.getColor()));

我们可以将上面的函数抽象化成泛型函数,这样就可以过滤香蕉,橘子等对象集合啦!!

行为参数化最大好处就是可以适应不断变化的需求。

 

总结:

1 行为参数化,就是一个方法接受多个不同的行为作为参数,在内部使用它们,完成不同行为的能力。

2 行为参数化可以让代码更好适应不同需求,减轻未来工作量。

3 传递代码,即将新行为作为参数传递给方法。可以用lambda表达式或者方法引用。

4 java api包含很多可以用不同行为进行参数化的方法,最常用就是排序,线程等。

 

 

Java8实战系列一的更多相关文章

  1. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  2. GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  3. GitHub实战系列~2.把本地项目提交到github中 2015-12-10

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  4. GitHub实战系列~3.提交github的时候过滤某些文件 2015-12-10

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  5. GitHub实战系列~4.把github里面的库克隆到指定目录+日常使用 2015-12-11

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  6. 05.GitHub实战系列~5.发布版本之分支操作+Tag讲解 2015-12-14

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  7. 07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)

    GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...

  8. Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...

  9. [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结

    一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核心复杂性应对之道.实现领域驱动设计 ...

随机推荐

  1. CentOS 7 系统的初化始配置

    安装好CentOS7系统后我们要进行初始设置来让我们的服务器方便管理与使用,但是发现在7以前的版本都能输入的命令不能输入了,去官网查查才发发生了很大的变化,关于有哪些变化的可以点击这里查看,初始配置的 ...

  2. SQL SERVER与C#数据类型对照表

    分类 SQL SERVER类型 类型说明 C#类型 精确数字 bigint 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807)  ...

  3. C#设计模式(15)——迭代器模式

    1.迭代器模式介绍 迭代器模式主要用于遍历聚合对象,将聚合对象的遍历行为分离出来,抽象为一个迭代器来负责.迭代器模式用的十分普遍,C#/JAVA等高级语言都对迭代器进行了封装用于遍历数组,集合,列表等 ...

  4. centos7安装minikube

    安装之前需要在bios中开启虚拟化功能.这里是在vmvare虚拟机中安装.开启步骤如下: 下载virtualbox 官网地址:https://www.virtualbox.org/ [virtualb ...

  5. Docker部署Consul集群

    服务介绍 Consul是一种分布式.高可用.支持水平扩展的服务注册与发现工具.包含的特性有:服务发现.健康检查.键值存储.多数据中心和服务管理页面等. 官方架构设计图: 图中包含两个Consul数据中 ...

  6. 出售爱奇艺 tx好莱坞 优酷 乐视 芒果 搜狐 等一个月会员激活码

    出售爱奇艺 tx好莱坞 优酷 乐视 芒果  搜狐 等一个月会员激活码  进群价格有优惠  QQ群:569333649

  7. hadoop HA 配置 + zookeeper 服务注册

    环境测试 6台机器 centos6.7 x64 master ( namenode/cluster ) 10.10.100.101 namenode1 10.10.100.105 namenode2 ...

  8. Linux之Ubuntu安装搜狗输入法

    1.下载搜狗输入法安装包 搜狗官网:https://pinyin.sogou.com/linux/ 2.更新ubuntu内置的包管理器apt-get的软件源[如果中途安装失败,经常是此原因造成的] s ...

  9. Java SE之基本程序设计结构

     概述:    0.注释    1.基本数据类型(有且仅有8个):         1.1 整型:int,short,long,byte(表示一个字节,[-128,127])          1.2 ...

  10. Python人工智能之路 - 第四篇 : jieba gensim 最好别分家之最简单的相似度实现

    简单的问答已经实现了,那么问题也跟着出现了,我不能确定问题一定是"你叫什么名字",也有可能是"你是谁","你叫啥"之类的,这就引出了人工智能 ...