作者:手机用户2602938525 | 来源:互联网 | 2023-07-13 12:15
Java|java教程javaJava-java教程Android卡片源码,电脑直接卸载ubuntu,官网在哪下载tomcat,爬虫软件js,php黑帽子,360百科排名千年seo
Java|java教程
java
Java-java教程
Android卡片源码,电脑直接卸载ubuntu,官网在哪下载tomcat,爬虫软件 js,php黑帽子,360百科排名千年seolzw
本篇文章给大家带来的内容是关于java8中predicate的用法介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
49个木马源码,vscode下载安装与使用,mac上装ubuntu,tomcat会话路径配置,爬虫电脑推荐,php grpc 扩展,宁波seo快速优化怎么做lzw
传递代码app播放器源码,U盘只读 ubuntu,tomcat 关闭快捷键,浴室出现爬虫,php电商项目核心,seo的历史lzw
我们首先看一个例子,假设你有一个 Apple 类,它有一个getColor方法,还有一个变量inventory保存着一个Apples的列表。你可能想要选出所有的绿苹果,并返回一个列表。通常我们用筛选(filter)一词来表达这个概念。在Java 8之前,你可能会写这样一个方法 filterGreenApples :
public static List filterGreenApples(List inventory){List result = new ArrayList();for (Apple apple: inventory){if ("green".equals(apple.getColor())) {result.add(apple); } }return result;}
但是接下来,有人可能想要选出重的苹果,比如超过150克,于是你心情沉重地写了下面这
个方法,甚至用了复制粘贴:
public static List filterHeavyApples(List inventory){List 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 filterApples(List inventory, Predicate p) { List result = new ArrayList(); for (Apple apple: inventory){ if (p.test(apple)) { result.add(apple); } } return result;}
要用它的话,你可以写:
filterApples(inventory, Apple::isGreenApple);
或者
filterApples(inventory, Apple::isHeavyApple);
什么是谓词?
从传递方法到 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 inventory = Arrays.asList(new FilteringApples1.Apple(80, "green"),new FilteringApples1.Apple(155, "green"),new FilteringApples1.Apple(120, "red")); List greenApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> "green".equals(a.getColor())); System.out.println(greenApples2); // [Apple{color='green', weight=155}] List heavyApples2 = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() > 150); System.out.println(heavyApples2); // [] List weirdApples = filterApples(inventory, (FilteringApples1.Apple a) -> a.getWeight() <80 ||"brown".equals(a.getColor())); System.out.println(weirdApples); } public static List filterApples(List inventory, Predicate p) { List 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 Collection filter(Collection c, Predicate p);
这样你甚至都不需要写 filterApples 了,因为比如先前的调用
filterApples(inventory, (Apple a) -> a.getWeight() > 150 );
就可以直接调用库方法 filter :
filter(inventory, (Apple a) -> a.getWeight() > 150 );