Stream
的 findAny
方法选择此流中的任何元素。 findAny
方法的行为是不确定的,可以自由选择此流中的任何元素。 findAny
方法对于在并行操作中获得最大性能很有用,但不能保证每次调用都获得相同的结果。
从 Java 文档中找到方法声明。
Optional<T> findAny()
上述方法返回 java.util.Optional
,一个容器对象,它可能包含也可能不包含非空值。
当方法在流中选择空值时,findAny
会抛出 NullPointerException
。
如果我们想每次都选择第一个元素,请使用 Stream
的 findFirst()
方法。
现在找到 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
查找使用 IntStream
、LongStream
和 DoubleStream
的 findAny
方法示例。
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
示例 3findAny
方法提高了并行流的性能,但我们知道重新运行时输出可能会有所不同。
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
。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.concretepage.com/java/java-8/java-stream-findany
内容来源于网络,如有侵权,请联系作者删除!