电商网站怎么做支付,百度商桥代码怎么添加到网站,商城站地址,网站备案需要哪些东西在前面的博客文章#xff08;“ 延迟执行Java的供应商 “#xff09;#xff0c;我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’#xff0c;‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为“ Java 8中… 在前面的博客文章“ 延迟执行Java的供应商 “我引用礁HORSTMANN的陈述书中‘ 的Java SE8为真的很急关于lambda表达式’‘所有的lambda表达式的点被推迟执行 。’ Horstmann在最后一年为Dobb博士的杂志写了一篇名为“ Java 8中的Lambda表达式 ”的文章其中他使用不同的术语写了类似的声明“ Lambda表达式是可以传递的代码块因此可以之后执行一次一次或多次。” 在该较早的文章中 我研究了JDK中的lambda表达式如何与标准功能接口Supplier一起使用以在“仅在必要时提供”单个值且未传递任何参数的情况下支持延迟执行。 在本文中我重点介绍JDK提供的示例这些示例使用Consumer标准功能接口“仅在必要时”“使用”或“处理”特定代码块。 Supplier接受任何参数并仅返回一个响应而Consumer接受一个或多个参数并且不返回响应。 在Supplier上调用的方法是get()方法并且是Consumer的accept(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.peekConsumer 。 这对于了解各种流操作对其各自的流元素所做的操作非常有用。 一种常见的实现方法是让提供给peek方法的Consumer是对System.out的调用。 println将当前处理的流元素打印到标准输出或记录该元素或将其打印到标准错误。 Javadoc文档中为Stream.peekConsumer方法提供了一个示例 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.forEachConsumer是一种对流的元素以“显式不确定性”的方式执行由提供的Consumer指定的操作的方法。 如果该流具有遇到顺序则Stream.forEachOrderedConsumer方法将以所提供的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()对Set和List进行此操作。 有方便的方法但是通过限定可迭代和执行由这些集合的实现其接受一个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接口没有像Set和List那样扩展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.walkFunction可能更常见但是这篇文章是关于Consumer 因此重点是StackWalker.forEachConsumer 。 此方法类似于先前讨论的Stream.forEach和Iterable.forEach方法并在下一个代码清单中进行了演示。 StackWalker.getInstance().forEach(out::println); 尽管JDK对Consumer BiConsumer以及其他类型的标准Consumer样式功能接口有更多的JDK使用 但本文中我要介绍的最后一个示例来自Optional类。 仅在存在时应用 方法Optional.ifPresentConsumer和Optional.ifPresentOrElseConsumer推迟执行提供的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 OptionalString 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