Java Stream findAny()方法示例

x33g5p2x  于2022-09-24 转载在 Java  
字(2.7k)|赞(0)|评价(0)|浏览(294)

StreamfindAny 方法选择此流中的任何元素。 findAny 方法的行为是不确定的,可以自由选择此流中的任何元素。 findAny 方法对于在并行操作中获得最大性能很有用,但不能保证每次调用都获得相同的结果。

从 Java 文档中找到方法声明。

Optional<T> findAny()

上述方法返回 java.util.Optional,一个容器对象,它可能包含也可能不包含非空值。
当方法在流中选择空值时,findAny 会抛出 NullPointerException
如果我们想每次都选择第一个元素,请使用 StreamfindFirst() 方法。
现在找到 findAny 示例。

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

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

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

再找一个代码。
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 方法将抛出 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

相关文章

微信公众号

最新文章

更多