版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/huanghanqian/article/details/102807972
收起

java
专栏收录该内容
18 篇文章0 订阅
订阅专栏
试验了一下java stream中的findAny和findFirst,发现都返回了列表中的第一个元素。那么,这两种方法的区别是什么呢?

查看了一下Java API document:

findFirst:

findFirst

Optional<T> findFirst()
Returns an Optional describing the first element of this stream, or an empty Optional if the stream is empty. If the stream has no encounter order, then any element may be returned.

This is a short-circuiting terminal operation.

Returns:

an Optional describing the first element of this stream, or an empty Optional if the stream is empty

Throws:

NullPointerException - if the element selected is null

顾名思义,即返回列表中的第一个元素。

这里的short-circuiting是指:有时候需要在遍历中途停止操作,比如查找第一个满足条件的元素或者limit操作。在Stream中short-circuiting操作有:anyMatch、allMatch、noneMatch、findFirst、findAny、limit,这些操作在Sink中都有一个变量来判断是否短路,比如limit用的是m,match用的是stop,find用的是hasValue。

这里的terminal operation是指:一个终结操作,比如foreach,IntStream.sum

那么,findAny是什么呢?

findAny

Optional<T> findAny()
Returns an Optional describing some element of the stream, or an empty Optional if the stream is empty.

This is a short-circuiting terminal operation.

The behavior of this operation is explicitly nondeterministic(不确定的); it is free to select any element in the stream. This is to allow for maximal performance in parallel operations; the cost is that multiple invocations(调用) on the same source may not return the same result. (If a stable result is desired, use findFirst() instead.)

Returns:

an Optional describing some element of this stream, or an empty Optional if the stream is empty

Throws:

NullPointerException - if the element selected is null

See Also:

findFirst()

可以看到findAny()操作,返回的元素是不确定的,对于同一个列表多次调用findAny()有可能会返回不同的值。使用findAny()是为了更高效的性能。如果是数据较少,串行地情况下,一般会返回第一个结果,如果是并行的情况,那就不能确保是第一个。比如下面的例子会随机地返回OptionalInt[50]。

System.out.println(IntStream.range(0, 100).parallel().findAny());
让我们来举另外一个例子:

List<String> lst1 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
List<String> lst2 = Arrays.asList("Jhonny", "David", "Jack", "Duke", "Jill","Dany","Julia","Jenish","Divya");
 
Optional<String> findFirst = lst1.parallelStream().filter(s -> s.startsWith("D")).findFirst();
Optional<String> fidnAny = lst2.parallelStream().filter(s -> s.startsWith("J")).findAny();
 
System.out.println(findFirst.get()); //总是打印出David
System.out.println(fidnAny.get()); //会随机地打印出Jack/Jill/Julia
参考链接:

1. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#findFirst--

2. https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#findAny--

3. https://stackoverflow.com/questions/35359112/difference-between-findany-and-findfirst-in-java-8
————————————————
版权声明:本文为CSDN博主「huanghanqian」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huanghanqian/article/details/102807972

findAny和findFirst区别相关推荐

  1. 告诉你一种精简、优化代码的方式

    来自:好好学java 相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道 ...

  2. Java8 的 Stream 流式操作之王者归来

    相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1 ...

  3. 详解Java8中流(Stream)的使用

    文章列表 一.回忆Lambda表达式 二.什么是流 1.流只能遍历一次 2.外部迭代和内部迭代 三.流操作 1.谓词筛选 2.筛选各异元素 3.截段流 4.跳过元素 5.map和flatMap 6.查 ...

  4. 简洁又快速地处理集合——Java8 Stream(下)

    上一篇文章我讲解 Stream 流的基本原理,以及它与集合的区别关系,讲了那么多抽象的,本篇文章我们开始实战,讲解流的各个方法以及各种操作 没有看过上篇文章的可以先点击进去学习一下 简洁又快速地处理集 ...

  5. Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)

    作者:Howie_Y,系原创投稿 主页:www.jianshu.com/u/79638e5f0743 Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 ...

  6. java supplier_Java 函数式编程

    前些年 Scala 大肆流行,打出来 Java 颠覆者的旗号,究其底气来源,无非是函数式和面向对象的"完美结合",各式各样的"语法糖",但其过高的学习门槛,又给 ...

  7. JDK8 JUC整理

    文章目录 一.内容与特点 二.理解线程 1.线程与进程 2.为什么线程不是越多越好? 3.Java中开启线程的方式 三.理解线程安全问题 1.什么是线程安全问题? 2.如何解决线程安全问题? 四.JD ...

  8. 【Java 8系列】Stream详解,看这一篇就够啦

    热门系列: [Java 8系列]收集器Collector与工具类Collectors [Java 8系列]Lambda 表达式,一看就废 [Java 8系列]Java日期时间的新主宰者:LocalDa ...

  9. java8 stream常用方法

    一. 什么是 Stream Stream 中文称为 "流",通过将集合转换为这么一种叫做 "流" 的元素序列,通过声明性方式,能够对集合中的每个元素进行一系列并 ...

最新文章

  1. C# FTP下载文件
  2. Cxf + Spring3.0 入门开发WebService
  3. 设计模式6——创建型模式之原型模式
  4. lisp 焊接符号标注_焊接符号标注大全
  5. [攻防世界 pwn]——实时数据监测
  6. .NET 6 Preview 4 已发布,ASP.NET Core 更新内容
  7. .NET Core跨平台的奥秘[下篇]:全新的布局
  8. JS之字符串连接方法join
  9. pandas 提取某几列_【科学计算工具二】初识Pandas
  10. leetcode 存在重复元素
  11. 如果要在mFC客户区添加控件怎么办
  12. python 进程池阻塞和非阻塞_Python协程还不理解?请收下这份超详细的异步编程教程!还没学会来找我!...
  13. easyui关于validatebox实现多重规则验证的实践
  14. nxlog收集windows事件方案
  15. 论文笔记:公钥密码算法的硬件实现及侧信道攻击研究(RSA部分)
  16. S7Comm Plus 协议研究
  17. ubuntu 安装nodebb
  18. Element 中图片预览后如何快速关闭
  19. U盘杀毒后文件不见/找回
  20. java-php-python-ssm“花花世界”网站计算机毕业设计

热门文章

  1. python UTC时间转换成北京时间
  2. Python究竟属不属于嵌入式语言?
  3. 微信小程序动漫论坛平台+后台管理系统SSM-JAVA【数据库设计、论文、源码、开题报告】
  4. 题目 740 “炫舞家“ST
  5. tar: Removing leading `//‘ from member names
  6. SQL中IS NOT NULL与!=NULL的区别
  7. 【python 游戏】闲的无聊?那就和博主一起来滑雪吧~
  8. oracle用imdp恢复数据库,impdp恢复数据库
  9. Android 不得不说的VideoView的一些坑及其解决方案(转)
  10. Motion Editor (三) 旋转,摆荡,过渡