美文网首页
java8之行为参数化,你用了吗?

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

作者: 我的小熊不见了 | 来源:发表于2019-03-06 19:21 被阅读8次

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

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

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

    在java8之前应该是这么写:

    Collections.sort(inventory, new Comparator<Apple>(){
        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<Apple> filterGreenApple(List<Apple> inventory){
        List<Apple> result = new ArrayList<>();
        for (Apple apple : inventory){
            if ("green".equals(apple.getColor())) {
                result.add(apple);
            }
        }
    }
    

    选出重量大于150克的苹果

    在java8之前应该是这么写:

    public static List<Apple> filterHeavyApples(List<Apple> inventory){
        List<Apple> 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<T>{
        boolean test(T t);
    }
    static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> p) {
         List<Apple> 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之行为参数化,你用了吗?

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