区块链技术博客
www.b2bchain.cn

使用peek和findAny对Java Stream结果感到困惑 – java程序员分享

本文介绍了使用peek和findAny对Java Stream结果感到困惑 – java程序员分享,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

我是Java的Stream API的新手,我对这种情况的结果感到困惑:

Stream<String> stream = Stream.of("A","B","C","D"); System.out.println(stream.peek(System.out::println).findAny().get()); 

打印:

A A 

为什么不打印:

A A B B C C D D 

参考方案

findAny method找不到所有元素;它只找到一个元素。

返回描述流中某些元素的Optional,如果流为空,则返回一个空的Optional
这是短路端子操作。

在调用终端方法(在这种情况下为findAny)之前,不会处理该流。但是 peek method不会在元素上执行其操作,直到该元素被终端操作消耗为止。

在流实现能够优化某些或所有元素的产生的情况下(例如使用findFirst之类的短路操作,或者在count()中描述的示例中),将不会为那些元素调用该操作。
findAny方法是短路的,因此只会针对peek找到的元素调用findAny的动作。
这就是为什么在打印输出中仅获得两个A值的原因。一种是通过peek方法打印的,第二种是Optional返回的findAny内部的值。

如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 🙂

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

试图绕过Java并发问题,并且很难理解线程池,线程以及它们正在执行的可运行“任务”之间的关系。如果我创建一个有10个线程的线程池,那么我是否必须将相同的任务传递给池中的每个线程,或者池化的线程实际上只是与任务无关的“工人无人机”可用于执行任何任务?无论哪种方式,Executor / ExecutorService如何将正确的任务分配给正确的线程? 参考方案 …

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 使用peek和findAny对Java Stream结果感到困惑 – java程序员分享
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们