从JAVA行为参数化到 JAVA8 lamada,方法引用

JAVA8无疑是JAVA的一次重大升级,JAVA8中引入了很多函数编程的思想。其中包括:lamada、stream流式编程、函数接口,方法引用等。本文主要讲解lamada,以及匿名函数的演化过程,最后是方法引用。
首先,来看一个栗子:

        File[] files = new File("C:/360极速浏览器下载/帮助及反_files").listFiles((file) -> file.getName().endsWith(".jpg"));
        for (File temp : files) {
            System.out.println(temp.getName());
        }

获取一个文件目录中的jpg文件,并输出文件名称到控制台。
虽然,是一个简单的栗子,但是包括了java里面的2个知识点:

  1. 行为参数化
  2. lamada
    下面通过一个栗子,来讲解为什么JAVA 里面建议使用行为参数化
    1、需求,帮助种植水果的农民从一堆苹果,找出其中成熟的苹果。(这里通过苹果的颜色来判断是否成熟)
public class Apple {
    private String color;
    private int weight;
    public Apple(String color, int weight) {
        super();
        this.color = color;
        this.weight = weight;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getWeight() {
        return weight;
    }
    public void setWeight(int weight) {
        this.weight = weight;
    }
}
        List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
        ,new Apple("red", 4),new Apple("blue", 5));
        for (Apple apple : apples) {
            if(apple.getColor().equals("red")){
                //获取到结果
            }
        }

现在,农民找到已经成熟的水果,并且比较大的水果(weight > 3),首先出售,避免损失。

        List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
        ,new Apple("red", 4),new Apple("blue", 5));
        for (Apple apple : apples) {
            if(apple.getColor().equals("red") && apple.getWeight() > 3){
                //获取到结果
            }
        }

此时,水果种植者,需要找到青色的苹果呢?….
我们又改怎样去实现?
比较上面2个实现,其实可以发现,除了 if 语句条件不同,其他的代码都是一致的。其实这也是 JAVA行为参数化的解决的一个问题,消除样式代码。

    public static void main(String[] args) {
        List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
        ,new Apple("red", 4),new Apple("blue", 5));
        getApple(apples, new Filter(){

            @Override
            public boolean filter(Apple apple) {
                return apple.getColor().equals("red");
            }

        });
        //这里如果,过滤条件发生改变,只需要传入不同的匿名对象即可。
    }

    public interface Filter{
        boolean filter(T t);
    }

    public static void getApple(List apples,Filter filter){
        for (Apple apple : apples) {
            if(filter != null && filter.filter(apple)){
                //获取到结果
            }
        }
    }

以上通过 传递 Filter 对象 ,来传入不同的过滤条件。但是通过匿名对象传入过滤条件,代码结构过于松散,代码可读性不高,并且语法繁琐。
为了解决这个问题JAVA8中引入了,lamada实现将函数作为参数传递,lamada是一个函数:

 apple -> apple.getColor().equals("red")

lamada : apple 函数参数,多个参数需要使用 ()包裹
-> 箭头
apple.getColor().equals(“red”) 方法体,一条语句,可以省略return ,多条语句,需要使用 { } 包裹。
介绍了lamada 的组成,以及书写。那么我们在哪些地方可以使用lamada呢?
可以看到,上面的例子中,lamada 作为 Filter 接口实现。而Filter 接口恰好只有一个抽象方法,知道 函数接口的同学,肯定已经猜到了,lamada 可以用在所有函数接口
什么是函数接口呢? 函数接口: 只有一个抽象方法的接口。注意: 这里的抽象方法,不包含 JAVA8中的默认方法和静态接口方法。
最后: 方法引用,方法引用又是什么呢?简单来说:方法引用是lamada 的一种简化写法,方法引用让我们可以重复使用现有的方法,冰像lamada一样传递他们。
如:根据苹果的重量进行排序

        List<Apple> apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
        ,new Apple("red", 4),new Apple("blue", 5));
        apples.sort(Comparator.comparing(Apple::getWeight));
        Comparator.comparing(Apple::getWeight) 将Apple 对象的getWeight 方法作为一个参数传递,同时返回另一个函数 Comparator 比较器。此处使用 静态导入comparing方法,代码会更加简洁
    apples.sort(comparing(Apple::getWeight));

JAVA8中,引入很多函数API,其中 java.util.function 函数包中,已经定义了,很多函数接口,如例子中的:filter 用来过滤,function 接收一个对象,返回一个处理的对象,或另一个对象,常用于 映射 map,以及consume 消费,接受一个参数 不返回。等等

你可能感兴趣的:(javaweb,java)