在先前的文章“ 用Java的供应商延迟执行 ”和“ Java的消费者延迟执行 “,我看着很容易地通过推迟标准Java API接受,分别在Java执行供应商 S和消费者秒。 在本文中,我将对标准JDK提供的API如何通过标准功能接口Predicate允许延迟执行进行类似的研究。 Predicate 在其Javadoc中进行了描述 ,“代表一个参数的谓词(布尔值函数)。” 换句话说, Predicate就像JDK提供的函数一样 ,但其返回值限制为truefalse

标准Java API中Predicate的最常见应用可能是在过滤器的上下文中。 这篇Predicate中的几个示例将演示Predicate结合过滤方法对Optional实例和Stream实例的使用。

Optional.filter(谓词)

可选类的filter(Predicate)方法的行为由其Javadoc文档以这种方式描述:“如果存在值,并且该值与给定谓词匹配,则返回描述该值的Optional ,否则返回空的Optional 。 ” 换句话说, Optional.filter(Predicate)返回一个Optional ,如果原始Optional为空或者应用于原始和当前OptionalPredicate解析为false ,则该Optional将为空。 否则,如果原始Optional确实具有“ present”值,并且应用于该值的Predicate返回true ,则返回的Optional也将具有相同的“ present”值。 下一个代码清单对此进行了说明(完整的源代码在GitHub上可用 )。

Optional.filter(Predicate)已展示

/*** Demonstrate use of {@code Optional.filter(Predicate)} on an* {@code Optional<Boolean>}.*/
public static void demonstrateOptionalFilterOnBoolean()
{out.print("\nfalse: ");getOptionalBoolean(false).filter(b -> b).ifPresent(out::print);out.print("\ntrue:  ");getOptionalBoolean(true).filter(b -> b).ifPresent(out::print);out.print("\nnull:  ");getOptionalBoolean(null).filter(b -> b).ifPresent(out::print);
}/*** Demonstrate use of {@code Optional.filter(Predicate)} on an* {@code Optional<Float>}.*/
public static void demonstrateOptionalFilterOnFloat()
{out.print("\n3.14: ");getOptionalFloat(3.14f).filter(f -> f > 0.0).ifPresent(out::print);out.print("\n-2.5: ");getOptionalFloat(-2.5f).filter(f -> f > 0.0).ifPresent(out::print);out.print("\nnull: ");getOptionalFloat(null).filter(f -> f > 0.0).ifPresent(out::print);
}

上面的代码清单中的两种方法演示了Optional.filter(Predicate)在基于数值比较的lambda表达式上产生直接boolean结果以及在lambda表达式上产生boolean结果的用法。 在一种情况下, Predicateboolean ,在另一种情况下, Predicate是数值比较。

Stream.filter(谓词)

Stream接口的方法filter(Predicate) 与同名的Optional类的方法相似 。 下一个代码清单演示了Stream.filter(Predicate)

展示了Stream.filter(Predicate)

/*** Demonstrates use of {@code Stream.filter(Predicate}}.*/
public static void demonstrateStreamFilter()
{final int maximum = 100;out.println("\nThe probable prime numbers between 1 and " + maximum + " are:");final Stream<BigInteger> bigIntegers = getConsecutiveBigIntegers(maximum);bigIntegers.filter(bi -> bi.isProbablePrime(100)).forEach(pp -> out.println(" " + pp));
}

上面的代码清单并不旨在演示识别Java中质数的最佳方法。 相反,它意在表明如何filter(Predicate)可以在调用Stream来缩小该要素Stream ,只有那些符合Predicate

对于我的下图Stream.filter(Predicate) ,我使用Pattern类的方便的方法asPredicate()供给的实例Predicate要被提供给使用这两个例子Stream.filter(Predicate)

演示了带有Pattern.asPredicate()的Stream.filter(Predicate)

/*** Demonstrates use of {@code Pattern.asPredicate()} to provide* a {@code Predicate} that can be used with {@code Stream.filter()}.*/
public static void demonstratePatternAsPredicateInFilter()
{final long count= getPotentialTelephoneNumbers().stream().filter(PATTERN.asPredicate()).peek(out::println).count();out.println(count + " valid telephone numbers.");
}

Collection.removeIf(谓词)

Collection接口指定(并作为默认方法实现 )有用的方法removeIf(Predicate) 。 还有Collection多个实现,它们实现了它们自己的removeIf(Predicate)的覆盖版本,包括ArrayDeque.removeIf(Predicate) , ArrayList.removeIf(Predicate)和Vector.removeIf(Predicate) 。

下面的代码清单演示了Collection.removeIf(Predicate)两个示例。 第一个示例使用Predicate.negate()方法取反期望的正则表达式模式,以便从集合中删除的元素是与正则表达式不匹配的元素。 第二个示例执行类似的功能,但是利用了JDK 11引入的“非”方法来执行此否定操作。

展示了带有否定的Pattern.asPredicate()的Collection.removeIf(Predicate)

/*** Demonstrates use of {@code Collection.removeIf(Predicate)}* in conjunction with {@code Predicate.negate()}.*/
public static void demonstrateCollectionRemoveIf()
{final Set<String> telephoneNumbers = new HashSet<>(getPotentialTelephoneNumbers());telephoneNumbers.removeIf(PATTERN.asPredicate().negate());out.println(telephoneNumbers);
}/*** Demonstrates use of {@code Collection.removeIf(Predicate)}* in conjunction with JDK 11-introduced {@code Predicate.not()}.*/
public static void demonstrateCollectionRemoveIfWithJdk11Not()
{final Set<String> telephoneNumbers = new HashSet<>(getPotentialTelephoneNumbers());telephoneNumbers.removeIf(not(PATTERN.asPredicate()));out.println(telephoneNumbers);
}

Stream.allMatch(谓词)

如果流中的每个元素都与提供的Predicate相匹配,则Stream接口的方法allMatch(Predicate)返回true 。 如果甚至单个元素都不匹配Predicate ,则该方法返回false

展示了Stream.allMatch(Predicate)

/*** Demonstrate use of {@code Stream.allMatch(Predicate)}.*/
public static void demonstrateStreamAllMatch()
{final Set<String> names = getNames();final boolean allNamesSixDigits = names.stream().allMatch(name -> name.length() == 6);out.println("Are all names " + names + " six digits? " + allNamesSixDigits);
}

Stream.anyMatch(谓词)

所述Stream.anyMatch(谓词)方法返回true ,如果它的元素中的至少一个相匹配的Predicate并返回false ,如果没有它的元素的匹配Predicate

展示了Stream.anyMatch(Predicate)

/*** Demonstrate use of {@code Stream.anyMatch(Predicate)}.*/
public static void demonstrateStreamAnyMatch()
{final Set<String> names = getNames();final boolean anyNamesSixDigits = names.stream().anyMatch(name -> name.length() == 6);out.println("Are any names " + names + " six digits? " + anyNamesSixDigits);
}

Stream.noneMatch(谓词)

所述Stream.noneMatch(谓词)方法返回true时在流没有元素匹配Predicate并返回false如果流中的至少一种元素确实匹配的Predicate

展示了Stream.noneMatch(Predicate)

/*** Demonstrate use of {@code Stream.noneMatch(Predicate)}.*/
public static void demonstrateStreamNoneMatch()
{final Set<String> names = getNames();final boolean noNamesSixDigits = names.stream().noneMatch(name -> name.length() == 6);out.println("Are no names " + names + " six digits? " + noNamesSixDigits);final boolean noNamesFourDigits = names.stream().noneMatch(name -> name.length() == 4);out.println("Are no names " + names + " four digits? " + noNamesFourDigits);
}

Collectors.partitioningBy(谓词)

尽管还有更多使用 Predicate JDK API ,但本文将通过讨论和使用Collectors.partitioningBy(Predicate)的示例进行总结。 这种有趣的方法将调用流的所有元素分为两组,一组与键Boolean.TRUE相关联(与Predicate匹配的元素),另一组与键Boolean.FALSE相关联的组(没有匹配Predicate )。 下一个代码清单利用此功能将整数分为偶数和奇数。

展示了Collectors.partitioningBy(Predicate)

/*** Demonstrate use of {@code Collectors.partitioningBy(Predicate)}.*/
public static void demonstrateCollectorsPartitioningBy()
{final Map<Boolean, List<Integer>> evensAndOdds= getConsecutiveIntegers(100).collect(Collectors.partitioningBy(integer -> integer % 2 == 0));out.println("Evens: " + evensAndOdds.get(Boolean.TRUE));out.println("Odds:  " + evensAndOdds.get(Boolean.FALSE));
}

我在上面的代码示例中使用了几种“帮助程序”方法,这些在本文中未显示。 这些“帮助程序”方法以及本文中显示的所有示例都可以在GitHub上找到 。

Java的标准功能接口Predicate是内置Java功能接口Function的一个特殊版本,可以说应该得到自己的专业化,因为true / false返回状态对于表示某些功能适用或不适用的条件非常有用。 这篇文章展示了JDK中的几个实例,在这些实例中, Predicate用于确定哪些流元素适用,是否使用Optional ,并将流元素分为满足谓词的元素和不满足谓词的元素。 在此过程中,还演示了便捷方法,例如Pattern.asPredicate()和Predicate.not() 。

翻译自: https://www.javacodegeeks.com/2018/07/deferred-execution-javas-predicate.html

Java谓词的延迟执行相关推荐

  1. java延时执行_Java谓词的延迟执行

    java延时执行 在先前的文章" 用Java的供应商延迟执行 "和" Java的消费者延迟执行 ",我看着很容易地通过推迟标准Java API接受,分别在Jav ...

  2. java怎么延迟执行语句_Go语言defer(延迟执行语句)

    Go语言中关键字defer允许我们推迟到函数返回之前(或任意位置执行return语句之后)一刻才执行某个语句或函数(为什么要在返回之后才执行这些语句?因为return语句同样可以包含一些操作,而不是单 ...

  3. java web每天定时执行任务(四步轻松搞定)

    第一步: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ...

  4. java 谓词_谓词::不适合Java

    java 谓词 Jim Laskey在OpenJDK core-libs-dev邮件列表上最近的消息" RFR:CSR – JDK-8203428 Predicate :: not &quo ...

  5. java线程池延期执行一次_Java使用者的延期执行

    java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...

  6. lambda 延迟执行_Java Lambdas和低延迟

    lambda 延迟执行 总览 有关在Java和低延迟中使用Lambda的主要问题是: 他们会产生垃圾吗,您能做些什么吗? 背景 我正在开发一个支持不同有线协议的库. 这个想法是,您可以描述要写入/读取 ...

  7. Java使用者的延期执行

    在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所有的lambda表达式的点被 ...

  8. 第 1-1 课:Java 程序是如何执行的?

    了解任何一门语言的精髓都是先俯览其全貌,从宏观的视角把握全局,然后再深入每个知识点逐个击破,这样就可以深入而快速的掌握一项技能.同样学习 Java 也是如此,本节就让我们先从整体来看一下 Java 中 ...

  9. java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...

    1.在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等.对于这样的操作最方便.高效的实现方式就是使用java.util.Timer工具类. private java.util.Time ...

最新文章

  1. 海天学院的打造IT人才讲座准备
  2. jquery控制只监听数字_JQuery通过一个开关来控制某个元素的监听
  3. deep learning 作業 2.2
  4. (史上最全)104个实用网络爬虫合集。
  5. ABP入门系列(3)——领域层定义仓储并实现
  6. python数组的乘法_在Python中乘法非常大的2D数组
  7. 漫步最优化二——基本优化问题
  8. jQuery实现滚动时动态加载页面内容
  9. 时隔 5 年,华为再发旧文《华为到该炸掉研发金字塔的时候了》意欲何为?
  10. Illustrator 教程,如何将 Illustrator 文档另存为 PDF?
  11. 【2022年江西省研究生数学建模】水汽过饱和的核化除霾 31页论文解析
  12. eclipse汉化流程
  13. kinect java_Kinect for Java
  14. python生词本的生词_词汇小助手V1.1——引入自动翻译和在线词典功能
  15. 物联网早期森林火灾探测
  16. 黄山杭州五日游攻略,厦门出发
  17. 每日积累【Day 3】Hbase架构深入学习
  18. 第1章 机器学习基础
  19. 亿道丨三防平板丨工业平板丨比消费类平板好在哪?
  20. 怎样用css3设计出向上向下的小箭头

热门文章

  1. ACM-ICPC中博弈论的一些小小总结
  2. 9、java中的异常处理机制
  3. Java 并发总结——线程池
  4. 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
  5. 动态代理proxy与CGLib的区别
  6. 获取Spring的ApplicationContext的几种方式
  7. C++描述杭电OJ 2014. 青年歌手大奖赛_评委会打分 ||
  8. avue中实现消息的实时展示
  9. 《白鹿原》金句摘抄(四)
  10. ssm使用全注解实现增删改查案例——Dept