Java8

1.通过行为参数化传递代码
行为参数化,就是一个方法接受多个不同的行为作为参数,并在内部使用它们,完成不同行为的能力。
例如

package com.anson.demo.entity;

public class Apple {
    private String color;
    private Integer weight;

    public Apple() {
    }

    public Apple(String color, Integer weight) {
        this.color = color;
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Integer getWeight() {
        return weight;
    }

    public void setWeight(Integer weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return "Apple{" +
                "color='" + color + '\'' +
                ", weight=" + weight +
                '}';
    }
}

没使用Lambda表达式

package com.anson.demo.test;

import com.anson.demo.entity.Apple;

public interface AppleFormatter {
    String accept(Apple a);
}

package com.anson.demo.test;

import com.anson.demo.entity.Apple;

public class AppleFancyFormatter implements AppleFormatter {
    @Override
    public String accept(Apple a) {
        String characteristic = a.getWeight() >150 ? "heavy" : "light";
        return "A" + characteristic + "" +a.getColor() + "Apple";
    }
}

package com.anson.demo.test;

import com.anson.demo.entity.Apple;

public class AppleSimpleFormatter implements AppleFormatter {
    @Override
    public String accept(Apple a) {
        return "An apple of" + a.getWeight() + "g";
    }
}

package com.anson.demo.test;

import com.anson.demo.entity.Apple;

import java.util.ArrayList;
import java.util.List;

public class AppleTest {
    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>();
        apples.add(new Apple("红色",120));
        apples.add(new Apple("红色",160));
        apples.add(new Apple("红色",100));
        apples.add(new Apple("绿色",120));
        apples.add(new Apple("绿色",180));

        prettyPrintApples(apples,new AppleFancyFormatter());
        prettyPrintApples(apples,new AppleSimpleFormatter());
        //prettyPrintApples(apples,(Apple a) -> "An apple of" + a.getWeight() + "g");
        
    }

    public static void prettyPrintApples(List<Apple> apples , AppleFormatter appleFormatter){
        for (Apple apple : apples) {
            String outPrint = appleFormatter.accept(apple);
            System.out.println(outPrint);
        }
    }

}

使用Lambda表达式

package com.anson.demo.test;

public interface Predicate<T> {
    boolean test(T t);
}
package com.anson.demo.test;

import com.anson.demo.entity.Apple;

import java.util.ArrayList;
import java.util.List;

public class AppleTest {
    public static void main(String[] args) {
        List<Apple> apples = new ArrayList<>();
        apples.add(new Apple("红色",120));
        apples.add(new Apple("红色",160));
        apples.add(new Apple("红色",100));
        apples.add(new Apple("绿色",120));
        apples.add(new Apple("绿色",180));
        
        List<Apple> appleFiter = fiter(apples, (Apple a) -> "红色".equals(a.getColor()));
        for (Apple apple : appleFiter) {
            System.out.println(apple);
        }
    }
    
    public static <T> List<T> fiter(List<T> list, Predicate<T> p){
        List<T> result = new ArrayList<>();
        for (T  e: list) {
            if(p.test(e)){
                result.add(e);
            }
        }
        return result;
    }
}

2.Lambda 表达式
2.1
语法:
(parameters) -> expression 或 (parameters) -> { statements; }
Java8

参数列表——这里它采用了Comparator中compare方法的参数,两个Apple。
箭头——箭头->把参数列表与Lambda主体分隔开。
Lambda主体——比较两个Apple的重量。表达式就是Lambda的返回值了。

例如
Java8
2.2
1)函数式接口就是只定义一个抽象方法的接口。
例如
Java8

注意 接口现在还可以拥有默认方法(即在类没有对方法进行实现时,其主体为方法提供默认实现的方法)。哪怕有很多默认方法,只要接口只定义了一个抽象方法,它就仍然是一个函数式接口。

2)用函数式接口可以干什么呢?
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例例(具体说来,是函数式接口一个具体实现 的实例)。
2.3
函数描述符
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。我们将这种抽象方法叫作函数描述符。

上一篇:10 个超棒的 JavaScript 简写技巧,前端开发资料分享


下一篇:Java8新特性 Stream() 数据操作