Java谓词的延迟执行

在先前的文章“ 用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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android实现评论列表_【Android视图效果】分组列表实现吸顶效果

效果图效果图分析先来分析一下&#xff0c;可以看到这是一个按月份分组的2行图片列表&#xff0c;列表顶部一个悬浮栏&#xff0c;会随着列表滑动而刷新&#xff0c;点击顶部栏&#xff0c;弹出了一个筛选框。思路1.列表部分可以用RecyclerViewGridLayoutManager&#xff0c;月…

用ajax写无限循环,ajax无限循环

// 猜你喜欢的无限加载(function(){var content document.getElementsByClassName("content")[0];var footer document.getElementsByTagName("footer")[0];var winh window.innerHeight - footer.offsetHeight;var ul document.getElementById("…

JDK 11:发行候选更新和OpenJDK JDK 11 LTS

JDK 11是预定被释放的一般可用性上周二&#xff0c;9月25日2018年2018年8月16日马克莱因霍尔德消息上OpenJDK的JDK-dev邮件列表宣布“ JDK 11现在在候选发布版阶段 。” 但是&#xff0c;Reinhold在2018年8月17日同一封邮件列表中的消息中提供了更新的详细信息&#xff0c;他在…

lr监控虚拟服务器,lr监控服务器 教程

lr监控服务器 教程 内容精选换一换本教程旨在演示使用GDS(General Data Service)工具将远端服务器上的数据导入GaussDB(DWS)中的办法&#xff0c;帮助您学习如何通过GDS进行数据导入的方法。在本教程中&#xff0c;您将&#xff1a;生成本教程需要使用的CSV格式的数据源文件。将…

mysql-5.5密码是多少_关于mysql-5.5数据库密码的设置和重置

一、mysql-5.5数据库的密码长什么样&#xff1f;直接打开给你看&#xff1a;[rootlnmp1 ~]# mysql -uroot -p#在已知密码的情况想打开数据库Enter password:Welcome to the MariaDB monitor. Commands end with ; or \g.Your MariaDB connection id is 4Server version: 5.5.64…

华为OD机试真题-停车场车辆统计-2023年OD统一考试(C卷)

题目描述: 特定大小的停车场,数组cars[]表示,其中1表示有车,0表示没车。车辆大小不一,小车占一个车位(长度1),货车占两个车位(长度2),卡车占三个车位(长度3),统计停车场最少可以停多少辆车,返回具体的数目。 输入描述: 整型字符串数组cars[],其中1表示有车,0…

vc mysql 图片_VC连接MySQL

一、MySQL的安装可以考虑安装mysql-5.0.41-win32(可到http://www.newhua.com/soft/3573.htm处下载)&#xff0c;当然你有更新的版本更好&#xff0c;注意选择“完全安装”(只有这样才会安装VC编译时需要的头文件等)。安装后期会进行服务器配置&#xff0c;你可以设置你的服务器…

魔兽巨龙追猎者服务器微信群,魔兽世界:难怪现在“龙脊”价格低,掉落率提升,群里一天出几个...

祥子哥最近几天一直在练猎人号&#xff0c;目前已经67级了&#xff0c;再过两三天差不多就能满级了。知道祥子哥为什么练猎人吗&#xff1f;不全是因为猎人伤害高玩着爽&#xff0c;还有另一个原因&#xff0c;那就是“龙脊奖章”现在价格很便宜&#xff0c;祥子哥使把劲应该能…

mysql group原理_MySQL Group By 实现原理分析

【IT168 专稿】由于 GROUP BY 实际上也同样会进行排序操作&#xff0c;而且与 ORDER BY 相比&#xff0c;GROUP BY 主要只是多了排序之后的分组操作。当然&#xff0c;如果在分组的时候还使用了其他的一些聚合函数&#xff0c;那么还需要一些聚合函数的计算。所以&#xff0c;在…

使用AWS Lambda的CloudWatch事件通知

CloudWatchEvents的主要用例是跟踪整个AWS基础架构中的更改。 当前&#xff0c;它支持在Auto Scaling组&#xff0c;EC2&#xff0c;EBS和其他各种事件中发出的事件。 为了对这些事件进行有意义的处理&#xff0c;我们需要一种消耗它们的方法。 AWS使用术语“ targets来指代任何…

nodejs接收表单写入mysql_NodeJS提交表单存数据库(转)

姓名&#xff1a;性别&#xff1a;年龄&#xff1a;手机&#xff1a;$(#ok_btn).on(click,function(){var name $.trim($(#name).val()),sex $.trim($(#sex).val()),age $.trim($(#age).val()),tel $.trim($(#tel).val()),data {name : name,sex : sex,age : age,tel : te…

r语言 中断r的输入_R语言_004数据输入

现实的情况是&#xff0c;我们大部分遇到的都是表格数据&#xff0c;在R语言里面叫数据框&#xff0c;数据来源一般不可能我们自己在程序开始前手动录入&#xff0c;正常的逻辑是从外面读取现成的数据&#xff0c;再预处理、建模什么的。根据经验&#xff0c;现在的数据来源主要…

我的机器人现在无处可去。 无家可归。 无服务器。

我通常会关注各种网站-有关最新出版物&#xff0c;热门新优惠&#xff0c;限时游戏和竞赛等。 其中大多数不提供“干净”的通知系统&#xff0c;例如RSS feed。 因此&#xff0c;我经常不得不刮擦他们HTML才能达到我所需要的。 这意味着我经常需要运行一些自定义的字符串操作…

mysql怎么对比表结构_mysql查看表结构2种方式对比

C语言之带有返回值的函数带有返回值的函数 语法: 类型 函数名(参数列表){ 函数体; return 数据; } 例: int getSum(int num1,int num2){ int sum num1 num2 ...mysql 列转行&#xff0c;合并字段数据表: 列转行:利用max(case when then) max---聚合函数 取最大值 (case cours…

dubbo 消费者也要暴露端口吗_一文详细解读 Dubbo 中的 http 协议

(给ImportNew加星标&#xff0c;提高Java技能)转自&#xff1a;Kirito的技术分享&#xff0c;作者&#xff1a;kiritomoe太阳红彤彤&#xff0c;花儿五颜六色&#xff0c;各位读者朋友好&#xff0c;又来到了分享 Dubbo 知识点的时候了。说到 Dubbo 框架支持的协议&#xff0c;…

非一致性访存系统_Hibernate事实:访存策略的重要性

非一致性访存系统在使用ORM工具时&#xff0c;每个人都承认数据库设计和实体到表映射的重要性。 这些方面引起了很多关注&#xff0c;而诸如获取策略之类的事情可能只是推迟了。 我认为&#xff0c;不应将实体获取策略与实体映射设计分开&#xff0c;因为除非经过适当设计&…

应用新的JDK 11字符串方法

在“ 使用JDK 11的Java字符串上的新方法 ”和“ String&#xff03;repeat即将加入Java&#xff1f; ”&#xff0c;我讨论了JDK 11引入Java String的六个新方法。 可用的早期访问JDK 11构建已经包含了这些新方法&#xff0c;在这篇文章中&#xff0c;我将使用其中的一种早期访…

mysql 传统数据恢复_mysql 数据恢复实例

基于二进制日志数据恢复mysql数据恢复演练实例如何按需截取日志基于position好的截取--start-position--stop-positionmysqlbinlog --start-position219 --stop-position1272 /data/binlog/mysql-bin.000002 >/tmp/back.sql恢复删除库 mysql> drop database oldboy1;mysq…

mysql 强制读主库_laravel(lumen)配置读写分离后,强制读主(写)库数据库,解决主从延迟问题...

在Model里面加上下面这句&#xff0c;强制读主(写)库数据库&#xff0c;解决主从延迟问题。public static function boot(){//清空从连接,会自动使用主连接DB::connection()->setReadPdo(null);}-------------------------------------------------------------------------…

为什么需要切换到在线签署文档和合同

嘿&#xff0c;怪胎&#xff0c; 今天&#xff0c;我们为您带来一些不同。 无论您是开发人员&#xff0c;经理还是设计师&#xff0c;这都会提高您的生产力和效率。 对于公司和个人而言&#xff0c;良好地管理文书工作是强大基础的最重要部分之一。 将工作流程从纸质转移到数…