写点什么

使用 Lambda 表达式和接口的简单 Java 8 Predicate 示例

作者:码语者
  • 2024-05-11
    上海
  • 本文字数:1819 字

    阅读完需:约 6 分钟

使用Lambda表达式和接口的简单Java 8 Predicate示例

大量的 Java 编程涉及到对真或假值的评估,从条件语句到迭代循环。当您使用 JDK 的 Streams API 和 Lambda 函数时,可以使用备受欢迎的 Java Predicate 接口来简化布尔条件的评估。


也被称为 Java 8 Predicate(源自引入函数式编程的 JDK 版本),这个简单的接口定义了五个方法,尽管只有 Java Predicate 的 test 方法在 Stream 或 Lambda 调用中被评估。



图 1:Java 8 Predicate 接口的五个方法的 JavaDoc 列表

传统的 Java 8 Predicate 示例:

尽管 Java 8 的 Predicate 是一个函数式接口,但开发人员仍可以以传统方式使用它。下面是一个 Java Predicate 示例,它简单地创建了一个扩展 Predicate 接口的新类,并在其主方法中使用 Predicate 的单独类:


import java.util.function.*;public class Java8PredicateTutorial {    public static void main(String args[]) {    PredicateExample example = new PredicateExample();    System.out.printf("Gretzky's number is even: %s", example.test(99));    boolean value = example.test(66);    System.out.printf("nLemieux's number is even: %s ", value);    }   }class PredicateExample implements Predicate<Integer> {  public boolean test(Integer x) {    if (x%2==0){      return true;    } else {    return false;    }  }}
复制代码



图 2:如何编译和运行 Java 8 Predicate 示例


图 2 展示了编译和执行这个 Predicate 接口教程时的结果。

Java Predicate 作为内部类:

如果您是一个喜欢内部类的开发人员,您可以对此进行一些简化,减少示例的冗长性。然而,这个 Java 8 Predicate 示例并不完全符合函数式编程的要求。


import java.util.function.*;public class Java8PredicateTutorial {  public static void main(String args[]) {    Predicate predicateExample = new Predicate<Integer>() {    public boolean test(Integer x) {        return (x % 2 == 0);        }    };    System.out.printf("Gretzky's number is even: %s", predicateExample.test(99));    System.out.printf("nLemieux's number is even: %s ", predicateExample.test(66));    }}
复制代码

Java Predicate lambda 示例

当然,如果您正在学习 Java 8 的 Predicate 接口,您很可能对如何在 Lambda 函数中使用它感兴趣。


Lambda 表达式的目标是减少 Java 代码的冗长性,特别是在需要覆盖只有一个功能方法的接口的情况下。以下是使用 Lambda 表达式创建 Java Predicate 的代码示例:


Predicate<Integer> lambdaPredicate = (Integer x) -> (x % 2 == 0);
复制代码


与传统的接口创建方法相比,毋庸置疑,Lambda 表达式更加简洁。


以下是完整的使用 Lambda 表达式实现的 Java Predicate 示例:


import java.util.function.*;public class Java8PredicateTutorial {  public static void main(String args[]) {                 /* Java predicate lambda example */    Predicate<Integer> lambdaPredicate = (Integer x) -> (x % 2 == 0);                 System.out.printf("Gretzky's number is even: %s", lambdaPredicate.test(99));    System.out.printf("nLemieux's number is even: %s ", lambdaPredicate.test(66));  }   }
复制代码

Java Predicate 和 lambda 流

自从 JDK 8 发布以来,函数式表达式已经在 Java API 中广泛应用。Streams API 广泛使用 Lambda 表达式和 Java Predicate,其中过滤表达式(filter expression)就是其中之一。下面是一个使用 Lambda 表达式、Stream 和 Predicate 的示例,从一个 Integer 对象的列表中提取出所有的偶数:


import java.util.function.*;import java.util.*;import java.util.stream.*;public class LambdaPredicateStreamExample {      public static void main(String args[]) {              List<Integer> jerseys = Arrays.asList(99, 66, 88, 16);    /* Java predicate and lambda stream example usage */    List<Integer> evenNumbers =          jerseys.stream()              .filter( x -> ((x%2)==0))                  .collect(Collectors.toList());              /* The following line prints: [66, 88, 16] 8 */    System.out.println(evenNumbers);  }}
复制代码


正如您所看到的,Java 的 Lambda 函数、流(Streams)和 Predicate 接口的组合使用可以创建非常紧凑的代码,既强大又易于阅读。




【注】本文译自:Simple Java 8 Predicate example with lambda expressions and interfaces

发布于: 刚刚阅读数: 3
用户头像

码语者

关注

分享程序人生。 2019-07-04 加入

“码”界老兵,分享程序人生。

评论

发布
暂无评论
使用Lambda表达式和接口的简单Java 8 Predicate示例_码语者_InfoQ写作社区