1.2 Java中的函数
编程语言的整个目的在于操作值。
Java可以操作的值
-
基本数据类型,例如42(int类型)和3.14(double类型);
-
对象,例如"abc"(String类型), new Integer(1111)(Integer类型);
-
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
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之间进行转换。

浙公网安备 33010602011771号