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);
网友评论