1.2 Java中的函数

编程语言的整个目的在于操作值。

Java可以操作的值

  1. 基本数据类型,例如42(int类型)和3.14(double类型);

  2. 对象,例如"abc"(String类型), new Integer(1111)(Integer类型);

  3. Java8新增了函数的语义,在运行时传递方法,在面向对象中增添函数式编程风格。

1.2.1 方法和Lambda作为一等公民

筛选隐藏文件

// 匿名类
new File(".").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isHidden();
    }
});

// 方法引用
new File(".").listFiles(File::isHidden);

// lambda表达式
new File(".").listFiles(file -> file.isHidden());

1.2.2 传递代码:一个例子

// 选出绿苹果
public static 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 static List<Apple> filterHeavyApples(List<Apple> inventory) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple: inventory) {
        if (apple.getWeight() > 150) {
            result.add(apple);
        }
    }
    return result;
}

// 调用
filterGreenApples(apples);
filterHeavyApples(apples);

方法引用改写,避免重复代码

public static boolean isGreenApple(Apple apple) {
    return "green".equals(apple.getColor());
}

public static boolean isHeavyApple(Apple apple) {
    return apple.getWeight() > 150;
}

public static List<Apple> filterApples(List<Apple> inventory, Predicate<Apple> predicate) {
    List<Apple> result = new ArrayList<>();
    for (Apple apple: inventory) {
        if (predicate.test(apple)) {
            result.add(apple);
        }
    }
    return result;
    }

filterApples(apples, Apple::isGreenApple);
filterApples(apples, Apple::isHeavyApple);

Predicate 等价Function<Apple, Boolean>,其中Predicate#test返回boolean。

1.2.3 从传递方法到Lambda

若函数只使用一次,使用lambda表达式,无需方法定义。

filterApples(apples, apple -> "green".equals(apple.getColor()));
filterApples(apples, apple -> apple.getWeight() > 150);

如果lambda的长度多于几行,用方法名称描述操作且基于方法引用,实践中更为清晰。

static <T> Collection<T> filter(Collection<T> c, Predicate<T> p);

Java8设计师并没有在原有的集合库中直接添加静态方法,而是设计新集合API——Stream,基于map、reduce、filter等完成操作,在Collections和Streams之间进行转换。

posted @ 2023-06-10 16:49  蒋智  阅读(21)  评论(0)    收藏  举报