文档章节

Java8学习笔记之行为参数化

Joepis
 Joepis
发布于 2017/04/22 14:06
字数 483
阅读 4
收藏 0

摘要: 原创出处 http://peijie2016.oschina.io 欢迎转载,保留摘要,谢谢!

用一个例子说明行为参数化带来的变化 - 从苹果仓库中筛选苹果

版本1

从一个苹果集合中选出绿的苹果

public static List<Apple> filterGreenApples(List<Apple> inventory) {
        List<Apple> result = new ArrayList<Apple>();
        for (Apple apple : inventory) {
            if ("green".equals(apple.getColor()) {
                result.add(apple);
            }
        }
        return result;
    }

版本2

这时,如果需求变了,要从集合中选出红苹果,我们会这样

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;
    }

然后传入颜色参数来筛选

List<Apple> apples = filterApplesByColor(inventory, "red");

版本3

但是,如果现在要选出重量超过150g的苹果呢?在方法参数列表中多加一个weight么? 你会发现我们所有的代码,只有if判断中的条件发生了变化,这违反了DRY原则(Don't Repeat Yourself)。

所以,我们把整个具体行为作为参数来传递,这样,方法体本身的代码就可以复用了。

    // 定义一个接口
    public interface ApplePredicate {
        boolean test(Apple apple);
    }

    public class AppleHeavyWeightPredicate implements ApplePredicate {
        public boolean test(Apple apple) {
            return apple.getWeight() > 150;
        }
    }

    public class AppleGreenColorPredicate implements ApplePredicate {
        public boolean test(Apple apple) {
            return "green".equals(apple.getColor());
        }
    }
    public static List<Apple> filterApples(List<Apple> inventory, ApplePredicate p) {
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory) {
            if (p.test(apple)) {
                result.add(apple);
            }
        }
        return result;
    }

现在,我们可以很灵活的调用了

List<Apple> redAndHeavyApples = filterApples(inventory, new AppleHeavyWeightPredicate());

版本4

其实,接口的具体实现,我们只会用到一次。所以,我们可以改成匿名类:

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

现在,代码已经变得非常简洁和灵活了。

版本5

从Java8开始,我们可以利用Lambda表达式,进一步改进代码:

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

现在,调用方法,我们只要一行代码,而且代码的可读性非常好。

© 著作权归作者所有

共有 人打赏支持
Joepis
粉丝 1
博文 36
码字总数 26112
作品 0
浦东
私信 提问
学习Linux的决心书

本人从事IT行业已经有十年了,之前一直接触的Windows操作系统的前后台,及会议系统电话系统,虚拟桌面等等工作。其实早在几年前我就发现到了瓶颈。薪资的提高有限。如果想要更好的发展必须要...

segastar660
2016/12/20
0
0
《Java8 实战》-第三章读书笔记(Lambda 表达式-01)

Lambda 表达式 在《 Java8 实战》中第三章主要讲的是,在上一章节的笔记中我们利用了行为参数化来因对不断变化的需求,最后我们也使用到了 Lambda,通过表达式为我们简化了很多代码从而极大地...

火力全開
2018/08/11
0
0
python的函数装饰器学习笔记

1 基本函数 首先正常的函数形式和调用方法: >>> def foo():... return 1>>> foo()1 2 嵌套函数 基本的嵌套函数形式和调用方法 >>> def outer():... x = 1... def inner():... print x # 1........

子夜闻雪
2015/12/29
117
0
狼一样的精神之CCNP奋斗史

北京小记 今天是2010年8月7日,为期3个月的NP培训到此告一段落. 在此刻写下心中的感受: 首先我要感谢带我入门的顾老师,戴老师,没有你们我就不会接触到思科,谢谢你们带我走近思科.在此我还要感...

徐会刚
2011/08/16
0
0
java8 (一):为神马要学习java8?

java8新特性 1.1 新特性介绍: 简而言之,java8的新特性就是:Lamdba函数(匿名函数),流,默认方法。 Java8 的灵活使用,会使得代码可读性更好(前提是你的同事也使用,别人不会,你强行使...

AHUSKY
2018/07/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java网络编程

基本概念 网络IO会涉及到同步,异步,阻塞,非阻塞等几个概念。 一个网络IO读取过程是数据从 网卡 到 内核缓冲区 到 用户内存 的过程。同步和异步区别在于数据从内核到用户内存的过程是否需要...

春哥大魔王的博客
26分钟前
1
0
Spring "reg:zookeeper" 的前缀 "reg" 未绑定等类似问题解决方案。

今天同事遇到一个Spring启动加载配置文件时,不识别reg:zookeeper标签的问题。 我查看配置,发现是Spring配置文件的头部没有引入reg标签的命名空间,具体如下图: 所以,以后遇到类似的标签未...

花漾年华
55分钟前
1
0
阿里云领衔云市场

近期,2018年Q4及全年的全球云基础设施服务市场数据新鲜出炉,发布方是美国市场研究机构Synergy Research Group。这个机构是专做电信网络市场情报的公司,成立于1999年,每年都会公布各大公有...

linuxCool
今天
2
0
C++友元函数和友元类(C++ friend)详解

私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书...

shzwork
今天
3
0
JAVA对map进行分组

public static Map<String, List<Map<String, Object>>> transition(List<Map<String, Object>> list){ Map<String, List<Map<String, Object>>> map = new HashMap<>(); //......

火龙战士
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部