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

java线程池延期执行一次

在前面的博客文章(“ 延迟执行Java的供应商 “),我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’,‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为《 Java 8中的Lambda表达式 》的文章,其中他使用不同的术语写了类似的声明,“ Lambda表达式是可以传递的代码块,因此可以稍后执行一次或多次。”

在该较早的文章中 ,我研究了JDK中的lambda表达式如何与标准功能接口Supplier配合使用,以在“仅在必要时提供”单个值且未传递任何参数的情况下支持延迟执行。 在本文中,我重点介绍JDK提供的示例,这些示例使用Consumer标准功能接口“仅在必要时”“使用”或“处理”特定代码块。 Supplier接受任何参数并仅返回一个响应,而Consumer接受一个或多个参数并且不返回响应。 在Supplier上调用的方法是get()方法,并且是Consumeraccept(T)方法。 根据定义, Consumer将“副作用”,因为它“消费”了提供的代码块。

java.util.function包中提供了许多Consumer样式的标准功能接口。 这些都不返回结果(这就是为什么他们是消费者!),但是它们在接受参数的数量和类型上有所不同(但是它们都至少接受一个参数)。 这些在这里列出:

  • 消费者 –接受单个论点的一般Consumer ,将成为本文大部分示例的关注中心。
  • BiConsumer –接受两个参数,而不是一个参数(“ 消费者的两类专业化”)
  • DoubleConsumer –适用于原始double的特殊消费者
  • IntConsumer –原始int的专门消费者
  • LongConsumer –适用于原始long的专业消费者
  • ObjDoubleConsumer –接受两个参数的专用消费者 ,第一个为Object类型,第二个为double类型
  • ObjIntConsumer –接受两个参数的专用消费者 ,第一个为Object类型,第二个为int类型
  • ObjLongConsumer –接受两个参数的专用消费者,第一个为Object类型,第二个为long类型

本文的其余部分将研究Consumer和相关类的JDK使用的子集,以帮助演示它们如何以及何时有用。

偷看流元素流

在博客文章“ 使用Stream.peek窥视Java Streams内部 ”中,我讨论了可用于查看流中流动元素的中间操作 Stream.peek(Consumer) 。 这对于理解各种流操作对其各自的流元素所做的操作非常有用。 一种常见的实现方法是让提供给peek方法的Consumer是对System.out的调用。 println将当前处理的流元素打印到标准输出(或记录该元素或将其打印到标准错误)。 Javadoc文档中为Stream.peek(Consumer)方法提供了一个示例:

Stream.of("one", "two", "three", "four").filter(e -> e.length() > 3).peek(e -> System.out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> System.out.println("Mapped value: " + e)).collect(Collectors.toList());

由于println(-)方法的各种重载版本都接受一个参数,但不返回任何内容,因此它们完全符合“ Consumer”的概念。

在迭代流元素上指定操作

尽管Stream.peek(Consumer)是一个中间操作,但Stream提供了另外两个接受Consumer方法,它们都是终端操作 ,并且都是“针对每个”方法。 方法Stream.forEach(Consumer)是一种对流的元素以“显式不确定性”的方式执行所提供的Consumer指定的操作的方法。 如果该流具有遇到顺序,则Stream.forEachOrdered(Consumer)方法将以所提供的Consumer 按照流的“ 遇到顺序 ”执行指定的操作。 在这两种方法的情况下,基于Consumer的“动作”都应该是“ 无干扰的” 。 两种方法都在下面演示。

Set.of("one", "two", "three", "four").stream().forEach(i -> out.println(i.toUpperCase()));Stream.of("one", "two", "three", "four").forEach(i -> out.println(i.toUpperCase()));List.of("one", "two", "three", "four").stream().forEachOrdered(i -> out.println(i.toUpperCase()));Stream.of("one", "two", "three", "four").forEachOrdered(i -> out.println(i.toUpperCase()));

上面的例子看起来非常相似。 当使用并行流处理时, forEach可能导致与forEachOrdered截然不同的结果的最明显情况是。 在这种情况下,它将使大多数发送者使用forEach而不是forEachOrdered

在可迭代元素上指定操作

前面的代码示例显示了使用Stream.forEach(Consumer)方法来迭代流。 这些示例还演示了如何通过首先在这些集合上调用stream()SetList进行此操作。 有方便的方法,但是,通过限定可迭代和执行由这些集合的实现,其接受一个Consumer ,并允许使用该集合的迭代forEach方法。 下一个代码清单中显示了此示例。

Set.of("one", "two", "three", "four").forEach(i -> out.println(i.toUpperCase()));
List.of("one", "two", "three", "four").forEach(i -> out.println(i.toUpperCase()));

尽管在上面的示例中使用了集合,但是实现Iterable的所有对象通常都将支持forEach方法(或违反接口的广告约定)。

指定映射条目迭代时的操作

尽管Java的Map接口没有像SetList那样扩展Iterable接口,但是Java Map仍然具有类似的功能,可以指定使用者“消费” Map每个条目。 因为Map有两个输入参数(键和值),所以它的forEach方法接受BiConsumer而不是到目前为止本文中讨论的Consumer 。 接下来显示一个简单的示例。

Map.of("Denver", "Colorado","Cheyenne", "Wyoming","Salt Lake City", "Utah","Boise", "Idaho").forEach((c, s) -> out.println(c + " is the capital of " + s));

走栈

StackWalker是JDK 9的一个受欢迎的补充,它提供了一种线程安全的方法来细读堆栈跟踪,并且是对StackTraceElement方法的重大改进。 对于开发人员来说,使用StackWalker.walk(Function)可能更常见,但是这篇文章是关于Consumer ,因此重点是StackWalker.forEach(Consumer) 。 此方法类似于先前讨论的Stream.forEachIterable.forEach方法,并在下一个代码清单中进行演示。

StackWalker.getInstance().forEach(out::println);

尽管JDK对Consumer , BiConsumer以及其他类型的标准Consumer样式功能接口有更多的JDK使用 ,但本文中我要介绍的最后一个示例来自Optional类。

仅在存在时应用

方法Optional.ifPresent(Consumer)和Optional.ifPresentOrElse(Consumer)推迟执行提供的Consumer ,以便仅在Optional不是“空”(包含非null值)的情况下才调用提供的Consumer 。 这是一个简单但功能强大的概念,简单易懂的示例说明了它们是如何工作的。

public void demonstrateOptionalIfPresent()
{getMiddleName(true).ifPresent(n -> out.println("Middle Name: " + n));
}public void demonstrateOptionalIfPresentOrElse()
{getMiddleName(false).ifPresentOrElse(n -> out.println("Middle Name: " + n),() -> displayMissingMiddleName());
}private Optional<String> getMiddleName(final boolean present)
{return present ? Optional.of("Wayne") : Optional.empty();
}private void displayMissingMiddleName()
{out.println("No middle name provided!");
}

如上面的代码清单所示,如果Optional不为空,则Optional.ifPresent和JDK 9引入的Optional.ifPresentOrElse()仅调用提供的Consumer 。 如果Optional为空,则ifPresent方法不执行任何操作,而ifPresentOrElse调用第二个参数( Runnable )。

接受一个或多个参数且不返回任何结果的标准Java功能接口包括一般的Consumer以及某些专门的使用者。 这些对于将执行推迟到给定条件发生之前(例如被迭代或确定存在)有用,并且在该条件发生时要应用的行为涉及一个或多个输入参数,而无需提供响应。 GitHub上提供了本文中显示的源代码示例。

翻译自: https://www.javacodegeeks.com/2018/06/deferred-execution-java-consumer.html

java线程池延期执行一次

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

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

相关文章

python时间序列数据分析,Python数据分析之时间序列

Python数据分析之时间序列发布时间&#xff1a;2020-07-10 06:56:27来源&#xff1a;51CTO阅读&#xff1a;808作者&#xff1a;up4ever1. 时间序列类型时间戳(timestramp)即特定的时刻固定时期(period)如2018年1月或2018年1月1日时间间隔(interval)由起始和结束时间戳表示2. P…

java jdk 序列化_JDK 11:Java序列化的终结开始了吗?

java jdk 序列化在博客文章“ 将Google的协议缓冲区与Java结合使用 ”中&#xff0c;我引用了乔什布洛赫&#xff08;Josh Bloch&#xff09;的第三版的有效Java &#xff0c;他写道&#xff1a;“没有理由在您编写的任何新系统中使用Java序列化。” Bloch建议使用“跨平台结构…

php+ksort+返回true,PHP preg_replace函数

mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit] )在PHP中用来执行正则表达式的匹配以及替换的函数。可以返回一个正则表达式转换后的值。在subject中搜索pattern模式的匹配项&#xff0c;并用replacement模式进行替换。如果指定了 limit&…

下拉选择框

</select> 标签有一个属性 multiple&#xff0c;将其设置成 multiple"multiple" 按住 Ctrl 键即可实现多选。 请看例子&#xff1a; <html><head><meta http-equiv"Content-Type" content"text/html; charsetgb2312" />…

rest端点_REST:使用Controller端点?

rest端点在一般的REST架构中&#xff0c;基本概念是资源。 在资源之后&#xff0c;下一步是为这些资源开发一个统一接口&#xff0c;这在HTTP领域通常意味着&#xff1a; 创建为POST 阅读就是GET 更新为PUT&#xff08;或部分更新为PATCH&#xff09; 删除已删除 在现实世…

Java 字符串与整数之间的互相转换

1、如何将字符串String转化为整数int int i Integer.parseInt(str); int i Integer.valueOf(my_str).intValue(); 注: 字串转成Double, Float, Long的方法大同小异。 2、如何将字符串String转化为Integer Integer integerInteger.valueOf(i)3、如何将整数 int 转换成字串 Str…

hello world_建立无服务器的“ Hello World”功能

hello world无服务器 &#xff0c;功能即服务&#xff08;FaaS&#xff09;或仅具有云功能&#xff0c;就可以编写将在云中运行的代码。 您可以使用多种不同的语言&#xff08;例如JavaScript&#xff08;Node.js&#xff09;&#xff0c;Swift&#xff0c;Python&#xff0c;J…

xshell调出oracle安装界面,XShell+Xmanager实现在XShell中显示远程服务器的图形界面

你可以使用Xmanager软件&#xff0c;远程安装Oracle软件&#xff0c;Linux操作系统使用字符安装并不影响这种方式的使用。这个方案也可以大大优化你的Linux系统的性能&#xff0c;进而提高你的数据库性能。启动你的的Xmanager&#xff0c;我现在使用的是3.0版本&#xff0c;接收…

Oracle 数据库错误信息:动态执行表不可访问,本会话的自动统计被禁止

使用 PL/SQL 时, 每次第一次打开表的时候会提示以下信息&#xff1a; 动态执行表不可访问&#xff0c;本会话的自动统计被禁止&#xff0c;原因&#xff1a;V$SESSION,V$SESSTAT,V$STATNAME 没有被授权&#xff0c;没有权限访问这几张表&#xff0c;所以没有本法进行统计!那就…

jdk类加载器执行步骤_[JDK 11] jcmd中的类加载器层次结构详细信息

jdk类加载器执行步骤自从在JavaOne 2012上听说 jcmd以来&#xff0c;我就一直是命令行诊断工具jcmd的 粉丝 。 从那时起&#xff0c;我已经广泛使用了此工具&#xff0c;并多次在此博客中发布过此工具&#xff1a; jcmd&#xff1a;一个可以全部统治的JDK命令行工具 确定活动…

7445 oracle,Oracle 10g impdp 报 ORA-7445 [_INTEL_FAST_MEMCPY.A] 解决方法

在Oracle 10.2.0.4 以后的平台&#xff0c;我们在使用数据泵导入物化视图时&#xff0c;可能会遇到如下错误&#xff1a;...ksedmp: internal or fatal errorORA-7445: exception encountered: core dump [_intel_fast_memcpy.A()10][SIGSEGV] [Address not mapped to object] …

如何通过 PL/SQL Developer 将 Excel 数据导入 Oracle 对应的表中

首先将 Excel 文件另存为文本文件&#xff0c;然后在点击 PL/SQL Developer 菜单栏的【工具】-【文本导入器】&#xff0c;打开后如图所示&#xff1a; 上述步骤操作完之后&#xff0c;点击【到oracle的数据】&#xff1a;

kafka grpc_模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

kafka grpc机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序&#xff08;如Kafka Streams或KSQL &#xff09;中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目…

Linux命令gitview,使用linux的gitview命令查看文件内容

使用linux的gitview命令查看文件内容发布时间&#xff1a;2020-07-22 10:23:42来源&#xff1a;亿速云阅读&#xff1a;99作者&#xff1a;清晨栏目&#xff1a;服务器这篇文章将为大家详细讲解有关使用linux的gitview命令查看文件内容&#xff0c;小编觉得挺实用的&#xff0c…

通过 PL/SQL Developer 建表

点击菜单栏的【文件】-【新建】-【表】&#xff0c;如下图所示&#xff1a;

nutshell_Nutshell中的Java 8语言功能-第2部分

nutshell编者注&#xff1a;您也可以在此处检查Part-1。 嗨&#xff0c;朋友&#xff0c;这是简明系列的Java 8语言功能的第2部分。 在这里&#xff0c;我们将讨论Java 8的以下功能&#xff1a; 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法&#xff1f; 静态方…

Windows 7 下安装 Oracle 数据库和 PL/SQL Developer

win7下无论是32bits还是64bits&#xff0c;建议只安装oracle 11g 32bits&#xff0c;然后直接安装pl/sql developer&#xff0c;不需要额外的配置&#xff0c;就可以通过pl/sql developer来访问数据库了&#xff0c;如果真要配置&#xff0c;就是配置下pl/sql developer的连接&…

linux临时文件创建失败,-bash: 无法为立即文档创建临时文件: 设备上没有空间

Linux在使用中&#xff0c;突然出现空间不足情况&#xff0c;解决步骤大致为先清除进程&#xff0c;再删除文件一、进程状况1、查看磁盘空间和使用情况(​“df -h”显示目前磁盘空间和使用情况。 “df -i” 以inode模式来显示磁盘使用情况。)# df -h2、查看清理进程/# lsof | g…

机器学习java_Java机器学习,第1部分

机器学习java您搜索了某种导出机器学习模型的方法&#xff0c;以便可以将它们用于评估数据&#xff0c;并且可以将它们导出为PMML格式。 您实际上是在Java生态系统中工作的&#xff0c;但没有动机为它编写PMML库或rest api。 然后&#xff0c;我将向您推荐LightningScorer &…