java延时执行_Java谓词的延迟执行
java延时执行
在先前的文章“ 用Java的供应商延迟执行 ”和“ Java的消费者延迟执行 “,我看着很容易地通过推迟标准Java API接受,分别在Java执行供应商 S和消费者秒。 在本文中,我将对标准JDK提供的API如何通过标准功能接口Predicate允许延迟执行进行类似的研究。 Predicate
在其Javadoc中进行了描述 ,“代表一个参数的谓词(布尔值函数)。” 换句话说, Predicate
就像JDK提供的函数一样 ,但是其返回值限制为true
或false
。
标准Java API中Predicate
的最常见应用可能是在过滤器的上下文中。 这篇Predicate
中的几个示例将演示Predicate
结合过滤方法对Optional实例和Stream实例的使用。
Optional.filter(谓词)
可选类的filter(Predicate)方法的行为通过其Javadoc文档进行了描述,“如果存在值,并且该值与给定谓词匹配,则返回描述该值的Optional
,否则返回一个空的Optional
。 ” 换句话说, Optional.filter(Predicate)
返回一个Optional
,如果原始Optional
为空,或者应用于原始和当前Optional
的Predicate
解析为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
结果的用法。 在一种情况下, Predicate
是boolean
,在另一种情况下, 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相关联的一组(不与键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延时执行
java延时执行_Java谓词的延迟执行相关推荐
- java 延时队列_Java实现简单延迟队列和分布式延迟队列
在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单,制订一个提醒的任务等都需要延迟队列,那么我们需要实现延迟队列.我们本文的梗概如下,同学们可以选择性阅读. 1. 实现一个简单的延迟队 ...
- Java谓词的延迟执行
在先前的文章" 用Java的供应商延迟执行 "和" Java的消费者延迟执行 ",我看着很容易地通过推迟标准Java API接受,分别在Java执行供应商 S和 ...
- js 延期执行_javaScript 中怎么延迟执行一个方法?
展开全部 function test() { alert("test"); } setTimeout(test, 1000); 其中,setTimeout为延迟执行方法,是JS原生 ...
- java 延时发送邮件_java编程实现邮件定时发送的方法
本文实例讲述了java编程实现邮件定时发送的方法.分享给大家供大家参考,具体如下: 最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些 ...
- android 每隔2秒执行_Android中实现延迟执行操作的三种方法
今天在敲代码的过程中,有个需求是延迟执行某方法. 整理收集了三种方法,自己用的是第三种. 第一种线程休眠:new Thread() { @Override public void run() { su ...
- java ruby脚本_Java 程序中直接执行 Ruby 脚本 (JRuby)
1.[代码]MainClass.java import java.io.BufferedReader; import java.io.FileReader; import javax.script.I ...
- AMD(异步执行)和CMD (同步执行)之间的区别是什么?
1. 为什么要使用模块化? 模块化的作用有以下这些: 可以解决命名冲突 管理依赖 提高代码的可读性 代码解耦,提高代码的复用性 AMD(异步执行) 是 RequireJS 在推广过程中对模块定义的规范 ...
- java线程池延期执行一次_Java使用者的延期执行
java线程池延期执行一次 在前面的博客文章(" 延迟执行Java的供应商 "),我引用礁HORSTMANN的陈述书中' 的Java SE8为真的很急关于lambda表达式','所 ...
- lambda 延迟执行_Java Lambdas和低延迟
lambda 延迟执行 总览 有关在Java和低延迟中使用Lambda的主要问题是: 他们会产生垃圾吗,您能做些什么吗? 背景 我正在开发一个支持不同有线协议的库. 这个想法是,您可以描述要写入/读取 ...
最新文章
- 【AJAX】JavaScript的面向对象
- 开发者社区SDK对应版本更迭信息
- JavaScript语言基础6
- Redis介绍使用及进阶
- HDU - 7091 重叠的子串(后缀自动机+set启发式合并+树上倍增)
- 腾讯虚拟主机上的端口开放问题
- 拼接的option会多出空行_Word空格,空行,页眉横线等问题,我只花一分钟就全解决了...
- 《数字时代汽车营销变革白皮书》发布,为新消费时代的车企营销提供指南
- java线程异常终止_java线程莫名异常退出时,如何捕获异常信息
- 小米台灯底座接口很松_小米新品,米家充电台灯,续航40小时,不足百元,米粉:买买买...
- 数据分析_金额业务数据知识
- 南阳理工acm括号配对问题
- 【STM32f401学习之路-00】搭建工程环境
- 3 Directory traversal
- SpringBoot整合Mybaits开发报java.lang.IllegalArgumentException: At least one base package must be specifie
- 投资不足半年,字节跳动退出李子柒签约公司“微念”
- html5移动端轮播图特效,支持移动端的纯js轮播图插件awesome-slider
- 剑指 Offer 40. 最小的k个数
- bugku(crypto)-聪明的小羊
- IE浏览器打不开网页解决方法之一