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

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

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

相关文章

java 代码造假_老板居然让我在Java项目中“造假”

1. 前言老板说&#xff0c;明天甲方要来看产品&#xff0c;你得造点数据&#xff0c;而且数据必须是“真”的&#xff0c;演示效果要好看一些&#xff0c;这样他才会买我们的产品&#xff0c;我好明年给你换个嫂子。一般开发接到这种过分要求都不会很乐意去做&#xff0c;这完全…

nginx php环境搭建_php+nginx环境配置

本篇文章的内容是PHP和nginx环境的配置&#xff0c;在这里分享给大家&#xff0c;也给有需要的朋友一个参考phpnginx环境配置1、首先需要准备的应用程序包。nginx&#xff1a;nginx/Windows-1.0.4php&#xff1a;php-5.2.16-nts-Win32-VC6-x86.zip (nginx下php是以FastCGI的方式…

javaone_旅行报告:JavaOne 2013 –重归荣耀

javaone我已经回来几天了&#xff0c;需要赶上过去几天一直搁置的所有事情。 对我来说&#xff0c;这是一年中最忙的时间。 JavaOne和OpenWorld在旧金山的整整一周。 一个非常简短的旅行报告。 年度ACED简报 你们中许多人都知道我是Oracle社区认可计划&#xff08;称为“ ACE计…

php如何禁用浏览器的缓存,php如何禁止浏览器使用缓存页面

【摘要】PHP即“超文本预处理器”&#xff0c;是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言&#xff0c;与C语言类似&#xff0c;是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php如何禁止浏览器使用缓存页面&#xff0c;让我…

使用Java EE和OIDC构建Java REST API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标准规…

php 长微博程序,长微博生成工具PHP源码 根据文字生成长微博图片 - substr_count

&#xfeff;PHP substr_count() 函数定义和用法substr_count() 函数计算子串在字符串中出现的次数。语法substr_count(string,substring,start,length)...] rtrim($matches[3],\"/);//获取图片的id$parent_dir_num substr_count( $matches[3], ../);$relative_dirname …

php 加密类,php加密类

这篇文章的主要内容是介绍了关于php加密类 &#xff0c;有着一定的参考价值&#xff0c;现在分享给大家&#xff0c;有需要的朋友可以参考一下namespace app\index\controller;class Crypt{private $key "";public function __construct($key null){if (!is_null($…

通过JavaFX标注制作动画效果

在本文中&#xff0c;您将学习如何使用JavaFX的动画API创建标注。 您可以在https://www.youtube.com/watch?vXTHbB0LRdT4的 YouTube网站上查看这些标注的演示示例。 什么是标注&#xff1f; 我敢肯定&#xff0c;您已经看过广告或科幻电影&#xff0c;它们使用在图像顶部显示…

php 继承内核中的基类,继承类上的PHP new self()正在创建一个基类对象

参见英文答案 > New self vs. new static 3个我有一个充当基类的类.然后我有几个继承它的类.我想开始使用静态语法加载继承的类,但行为没有多大意义.直到现在我加载了这样的类,它完成了这项工作.$obj new foo();$something $obj->B…

使用trackBy启动流程

仍然沿用Corda Services的趋势&#xff0c;我还有其他一些技巧可帮助您的CorDapp顺利工作。 这次&#xff0c;我们将重点关注使用trackBy从服务内部启动流以及如果您不小心可能会引起的离散问题。 这应该是一个相对简短的职位&#xff0c;因为我可以依靠之前的职位&#xff1a…

过防火墙一句话php2017,dedeCMS友情链接getshell漏洞利用

1.php//print_r($_SERVER);$referer $_SERVER[HTTP_REFERER];$dede_login str_replace("friendlink_main.php","",$referer);//去掉friendlink_main.php&#xff0c;取得dede后台的路径//拼接 exp$muma .;$exp tpl.php?actionsavetagfile&actiond…

java 1.8新增功能_Java 8的新增功能(第二部分-可能会出现什么)

java 1.8新增功能免责声明&#xff1a;我不为Oracle工作&#xff0c;也不以任何方式代表Oracle。 此功能列表不是官方的。 作为“局外人”&#xff0c;这只是我研究的一部分。 这是由三部分组成的系列文章的第二部分。 在第一部分中 &#xff0c;我谈到了Oracle正式让开发人员…

Spring应用架构

我最近收到我博客的一位读者Ajay的问题&#xff0c;并决定在此处分享我的答案&#xff0c;以帮助其他有类似问题的人。 这是来自阿杰的问题&#xff1a; 大卫您好&#xff0c;我想知道我最近遇到的两种MVC应用程序体系结构之间的区别&#xff1a; 1&#xff09;在普通的Spri…

PHP能不能让一串代码现实,一段让你认清现实的Java代码.java

/*** 答致命三问* 终回归现实*/public static void main(String[] args) {boolean a false,b false,c false;java.util.Scanner scanner new java.util.Scanner(System.in);System.out.println(decode("5oKo5aSa6auY77yIY23vvInvvJ8"));int height 0;while (hei…

java+springmvc+vo,springmvc+mybatis的实例详解

前面讲到&#xff1a;SpringSpringMVCMyBatis深入学习及搭建(十三)——SpringMVC入门程序(二)1.需求使用springmvc和mybatis完成商品列表查询。2.整合思路springmvcmybatis的系统架构&#xff1a;第一步&#xff1a;整合dao层mybatis和spring整合&#xff0c;通过spring管理map…

java是面向过程的编程语言吗,下列关于Java语言特点的叙述中,错误的是()。 A.Java是面向过程的编程语言B.Java支持分...

查询最近30天的记录应使用( )作为准则某企业年度主营业务收入为以下关于第一层ISP特征的描述中,错误的是测量电压时&#xff0c;应将数字万用表与被测电路并联。()HLAⅡ类分子主要分布于在铁碳合金相图中今年来,公务员逐渐成为广大高校毕业生所青睐的热门职业,但是报考公务员必…

了解为什么这个直观的工具是您团队的通用团队管理工具

每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;以便它们既可行又相关…

ecshop 模板 php代码,ecshop无法在模板文件.dwt和.lbi中直接添加php代码的解决方法...

ecshop不能在模板文件.dwt和.lbi中直接添加php代码了&#xff0c;为什么呢&#xff1f;因为直接在模板中加入php函数和代码&#xff0c;没有经过过滤&#xff0c;容易造成安全隐患。程序源码安全是比较重要的。不过如果有朋友希望能在模板文件中直接加入.dwt和.lbi文件&#xf…

php mail 在线,在线web e-mail发送

名称&#xff1a;CJ Web2Mail V3.0说明&#xff1a;很多网站的“Contact Us ”打开的是outlook,但很多人没装。本人提供的是web发。可以给管理员发信的人自动发一封确认信&#xff0c;同时管理员也可以收到一封&#xff01;演示&#xff1a;http://phptext.512j.com(左下角的“…

jstl视图_使用JSTL视图探索Spring Controller

jstl视图让我们通过对Spring MVC的Controller开发的更多探索来改进我们以前的Spring JDBC应用程序 。 我将展示另一种编写新的Controller的练习&#xff0c;该Controller处理HTML表单并在JSP视图页面中使用JSTL标签。 要在Spring MVC应用程序中启用JSTL&#xff0c;您需要将以…