本篇文章给人人带来的内容是关于java8中predicate的用法引见(代码示例),有肯定的参考价值,有须要的朋侪能够参考一下,愿望对你有所协助。
通报代码
我们首先看一个例子,假定你有一个 Apple 类,它有一个getColor要领,另有一个变量inventory保存着一个Apples的列表。你能够想要选出一切的绿苹果,并返回一个列表。一般我们用挑选(filter)一词来表达这个观点。在Java 8之前,你能够会写如许一个要领 filterGreenApples :
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; }
然则接下来,有人能够想要选出重的苹果,比方凌驾150克,因而你心境沉重地写了下面这
个要领,以至用了复制粘贴:
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; }
我们都晓得软件工程中复制粘贴的风险——给一个做了更新和修改,却忘了另一个。嘿,这
两个要领只要一行差别: if 内里高亮的那行前提。假如这两个高亮的要领之间的差别仅仅是接收
的分量局限差别,那末你只要把接收的分量上下限作为参数通报给 filter 就好了,比方指定
(150, 1000) 来选出重的苹果(凌驾150克),或许指定 (0, 80) 来选出轻的苹果(低于80克)。
然则,我们前面提过了,Java 8会把前提代码作为参数通报进去,如许能够防止 filter 要领
涌现反复的代码。如今你能够写:
public static boolean isGreenApple(Apple apple) { return "green".equals(apple.getColor()); } public static boolean isHeavyApple(Apple apple) { return apple.getWeight() > 150; } 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);
什么是谓词?
前面的代码通报了要领 Apple::isGreenApple (它接收参数 Apple 并返回一个
boolean )给 filterApples ,后者则愿望接收一个 Predicate<Apple> 参数。词 谓词(predicate)
在数学上经常用来代表一个相似函数的东西,它接收一个参数值,并返回 true 或 false 。你
在后面会看到,Java 8也会许可你写 Function<Apple,Boolean> ——在学校学过函数却没学
过谓词的读者对此能够更熟习,但用 Predicate<Apple> 是更规范的体式格局,效力也会更高一
点儿,这防止了把 boolean 封装在 Boolean 内里。
从通报要领到 Lambda
把要领作为值来通报明显很有效,但如果为相似于 isHeavyApple 和 isGreenApple 这类可
能只用一两次的短要领写一堆定义有点儿烦人。不过Java 8也处理了这个题目,它引入了一套新
记法(匿名函数或Lambda),让你能够写
filterApples(inventory, (Apple a) -> "green".equals(a.getColor()) );
或许
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
以至
filterApples(inventory, (Apple a) -> a.getWeight() < 80 ||
"brown".equals(a.getColor()) );
完全的代码为:
public class FilteringApples1 { public static void main(String[] args) { List<FilteringApples1.Apple> inventory = Arrays.asList(new FilteringApples1.Apple(80, "green"), new FilteringApples1.Apple(155, "green"), new FilteringApples1.Apple(120, "red")); List<FilteringApples1.Apple> greenApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> "green".equals(a.getColor())); System.out.println(greenApples2); // [Apple{color='green', weight=155}] List<FilteringApples1.Apple> heavyApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() > 150); System.out.println(heavyApples2); // [] List<FilteringApples1.Apple> weirdApples = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() < 80 || "brown".equals(a.getColor())); System.out.println(weirdApples); } public static List<FilteringApples1.Apple> filterApples(List<FilteringApples1.Apple> inventory, Predicate<FilteringApples1.Apple> p) { List<FilteringApples1.Apple> result = new ArrayList<>(); for (FilteringApples1.Apple apple : inventory) { if (p.test(apple)) { result.add(apple); } } return result; } public static class Apple { private int weight = 0; private String color = ""; public Apple(int weight, String color) { this.weight = weight; this.color = color; } public Integer getWeight() { return weight; } public void setWeight(Integer weight) { this.weight = weight; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public String toString() { return "Apple{" + "color='" + color + '\'' + ", weight=" + weight + '}'; } } }
java8中内置filter函数
static <T> Collection<T> filter(Collection<T> c, Predicate<T> p);
如许你以至都不须要写 filterApples 了,由于比方先前的挪用
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
就能够直接挪用库要领 filter :
filter(inventory, (Apple a) -> a.getWeight() > 150 );
以上就是java8中predicate的用法引见(代码示例)的细致内容,更多请关注ki4网别的相干文章!