【Java 8 新特性】Java Stream通过findAny()返回任意一条数据

102 篇文章 73 订阅
本文详细介绍了Java Stream的findAny()方法,包括其不确定的行为、在并行流中的性能优化以及可能的输出变化。通过示例展示了findAny如何在有序和并行流中工作,并强调了它不适用于随机选择场景。此外,还提供了在不同数据类型流中使用findAny的示例,以及在处理可能为null值时的注意事项。
摘要由CSDN通过智能技术生成

StreamfindAny方法选择该流中的任何元素。

findAny方法的行为是不确定的,它可以自由选择流中的任何元素。

findAny方法有助于在并行操作中获得最大的性能,但它不能保证每次调用都得到相同的结果。

java doc中的findAny()方法声明

Optional<T> findAny() 

上述方法返回java.util.Optional,一个容器对象,可能包含也可能不包含非空值。

当方法在流中选择null值时,findAny抛出NullPointerException

如果每次都要选择第一个元素,请使用StreamfindFirst()方法。

下面是findAny的示例。

示例1
假设我们有一个整数流。

Stream.of(10, 20, 30).findAny()
  .ifPresent(s -> System.out.println(s)); 

此执行在一般情况下,并不会随机输出,而是按顺序输出,因为该流是有顺序的串行流,按照最优执行会按照顺序,感谢静夜的DD大佬的指出。

如果我们想要看到随机选择,需要改成并行流。

Stream.of(10, 20, 30).parallel().findAny()
  .ifPresent(s -> System.out.println(s)); 

再次调用findAny方法时,可以自由选择流中的任何元素,这意味着findAny可以给出10、20或30的输出。

注: findAny不是为了随机而随机,而是为了进行最快速的选择,所以最好不要用在随机选择的场景。

再看一组例子

FindAnyDemo1.java

package com.concretepage;
import java.util.Arrays;
import java.util.List;
public class FindAnyDemo1 {
  public static void main(String[] args) {
	List<String> list = Arrays.asList("Mahesh", "Suresh", "Mohit");
	String output = list.stream()
	  .filter(e -> e.startsWith("M"))
	  .findAny()
	  .orElse("NA");
	System.out.println(output);

	List<Integer> numList = Arrays.asList(21, 22, 23, 24);
	numList.stream()
	  .filter(n -> n % 2 == 0)
	  .findAny()
	  .ifPresent(e -> System.out.println(e));
  }
} 

输出

Mahesh
22 

查看上面的代码行

list.stream().filter(e -> e.startsWith("M")) 

过滤后流中包含“Mahesh”、“Mohit”。findAny可以自由选择其中任何一个。所以,如果我们多次运行这个例子,输出并不一定每次都相同。

示例2
下面是使用IntStreamLongStreamDoubleStreamfindAny方法示例。

FindAnyDemo2.java

package com.concretepage;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
import java.util.stream.LongStream;
public class FindAnyDemo2 {
  public static void main(String[] args) {
	IntStream intStream = IntStream.of(10, 20, 30, 40);
	intStream.filter(i -> i > 20).findAny()
	     .ifPresent(i -> System.out.println(i));

	LongStream longStream = LongStream.of(100, 200, 300);
	longStream.filter(l -> l < 250).findAny()
	     .ifPresent(l -> System.out.println(l));

	DoubleStream doubleStream = DoubleStream.of(100.52, 200.55, 300.66);
	doubleStream.filter(d -> d > 200).findAny()
	     .ifPresent(l -> System.out.println(l));
  }
} 

输出

30
100
200.55 

示例3
findAny方法提高了并行流的性能,但我们要知道,重新运行时输出可能会有所不同。

FindAnyDemo3.java

package com.concretepage;
import java.util.ArrayList;
import java.util.List;
public class FindAnyDemo3 {
  public static void main(String[] args) {
	List<Employee> list = new ArrayList<>();
	list.add(new Employee("Emp A", 3000));
	list.add(new Employee("Emp B", 4000));
	list.add(new Employee("Emp C", 5000));
	list.add(new Employee("Emp D", 6000));

	list.parallelStream()
	    .filter(e -> e.getSal() >= 4000 && e.getSal() <= 5000)
	    .mapToInt(e -> e.getSal())
	    .findAny()
		.ifPresent(s -> System.out.println(s));
  }
}
class Employee {
  private String name;
  private int sal;

  public Employee(String name, int sal) {
	this.name = name;
	this.sal = sal;
  }
  //Sets and Gets
} 

输出

5000 

示例4
如果findAny方法选择null值,则抛出NullPointerException

FindAnyDemo4.java

package com.concretepage;
import java.util.stream.Stream;
public class FindAnyDemo4 {
  public static void main(String[] args) {
	Stream.of(null, "AA").
	    findAny().ifPresent(s -> System.out.println(s));
  }
} 

输出将为NullPointerException

参考文献

【1】Java doc: Stream
【2】Java Stream findAny()

  • 16
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫巳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值