美文网首页
Java 8 行为参数化与Lambda

Java 8 行为参数化与Lambda

作者: 一课一练 | 来源:发表于2018-05-14 18:06 被阅读0次

我们需要从一堆苹果中按颜色挑出符合要求的苹果。最初,我们可能会按不同的条件写几个相似的方法来做这件事

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

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

好像重复的代码有点太多了,只有颜色的判断条件不同而已,我们做一个重构

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

单单颜色不能满足我们的需求,我们还希望按重量来过滤

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

颜色版本和重量版本差的只是判断条件,其他部分依然是相同的,同理对其他属性来说情况也是一样的,所以我们引入行为参数化。

  • Version 4
public interface ApplePredicate{
    public boolean test(Apple apple);
}
public List<Apple> filterApples(List<Apple> inventory, ApplePredicate p){
    List<Apple> result = new ArrayList<>();
        for(Apple apple: inventory){
            if(p.test() ){
                result.add(apple);
            }
        }
    return result;
}

public AppleGreenColorPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return "green".equals(apple.getColor());
    }
}
public AppleWeightPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return apple.getWeight() > 150; 
    }
}

行为参数化解决了我们的主要问题,但是实现看起来有点啰嗦,我们要实现AppleGreenColorPredicate,AppleWeightPredicate等等,有许多重复的类定义代码。Java 7时代我们使用匿名类来减少一部分代码

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

到了Java 8我们可以使用Lambda来替代不易使用的匿名类

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

这样就简洁很多了。

相关文章

  • Java 8 行为参数化与Lambda

    我们需要从一堆苹果中按颜色挑出符合要求的苹果。最初,我们可能会按不同的条件写几个相似的方法来做这件事 Versio...

  • 【Java8】Java8实战之行为参数化与Lambda

    Java8实战之行为参数化与Lambda 前言 现在Java的迭代速度比以前快了很多,然而,本渣渣最近才开始学习J...

  • 【Java8】Java8实战之Stream

    Java8实战之Stream 前言 在前面一个小节中,我们已经学习了行为参数化以及Lambda表达式,通过Lamb...

  • [代码简化] 1 Lambda表达式

    1、lambda表达式 1.1 lambda 利用lambda表达式代替匿名参数类,将行为进行参数化传递到代码中,...

  • Java 8——行为参数化

    参考原文链接 前言 Java 8中新增的功能是自Java 1.0发布以来18年以来,发生变化最大的一次。我本身没有...

  • Java 8——行为参数化

    前言 《Java8实战》不得不说是一本好书,捧起来看起来就兴奋得不想放下,其中介绍的函数式编程实在是太令人兴奋了,...

  • Lambda表达式知识手册

    1.行为参数化 行为参数化是将方法的具体实现抽象化,java8之前可以使用接口(策略模式,根据不同需求需要编写...

  • Java各版本新特性总结

    Java 8 新特性 Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法...

  • Java8-Lambda

    Java8-Lambda Java 8 的最大变化是引入了 Lambda 表达式——一种紧凑的、传递行为的方式 引...

  • Java8

    List类型抽象化 关键字: 谓词 行为参数化 匿名类 Lambda 策略模式 Lambda表达式 函数式接口就是...

网友评论

      本文标题:Java 8 行为参数化与Lambda

      本文链接:https://www.haomeiwen.com/subject/houjdftx.html