java8之行为参数化,你用了吗?

java8之行为参数化,你用了吗?

java8新增加了方法引用::语法(将方法作为参数)。将方法的引用传递进去,可以极大地简化你的代码。

需求1,将库存中的苹果按照重量排序:

在java8之前应该是这么写:

Collections.sort(inventory, new Comparator(){
    public int compare(Apple a1, Apple a2) {
        return a1.getWeight().compareTo(a2.getWeight());
    }
})

在java8中,可以这么实现:

inventory.sort(comparing(Apple::getWeight);

需求2,找到当前文件夹下所有的隐藏文件:

在java8之前应该是这么写:

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

需要将方法用对象包装,然后将对象传递进去。

在java8中,可以这么实现:

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

直接传递方法引用。

选苹果

选出仓库中所有的绿苹果

在java8之前应该是这么写:

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

选出重量大于150克的苹果

在java8之前应该是这么写:

public static List filterHeavyApples(List inventory){
    List result = new ArrayList<>();
    for (Apple apple : inventory) {
        if (apple.getWeight() > 150) {
            result.add(apple);
        }
    }
}

在java8中,可以这么实现:

public static boolean isGreenApple(Apple apple) {
    return "green".equals(apple.getColor());
}
public static boolean isHeavyApple(Apple apple) {
    return apple.getWeight() > 150;
}
public interface Predicate{
    boolean test(T t);
}
static List filterApples(List inventory, Predicate p) {
     List result = new ArrayList<>();
     for (Apple apple : inventory) {
         if (p.test(apple)) {
             result.add(apple);
         }
     }
    return result;
}
// 使用
filterApples(inventory, Apple::isGreenApple);
filterApples(inventory, Apple::isHeavyApple);

如果你觉得这么用太麻烦了,也可以使用以下方式:

filterApples(inventory, (Apple a) -> "green".equals(a.getColor()));
filterApples(inventory, (Apple a) -> a.getWeight() > 150);

你可能感兴趣的:(java8之行为参数化,你用了吗?)