Java8 Stream之findFirst()与findAny()详解

作者 | 2020年4月4日

在Java8中,Stream.findFirst()方法可以返回Stream中的第一个元素,Stream.findAny()方法可以返回Stream中的任意一个元素。

1. findFirst()方法

1.1 获取Stream中的第一个元素。

Java8FindFirstExample1.java

package cc.myexample.java8;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Java8FindFirstExample1 {

    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1, 2, 3, 2, 1);

        Optional<Integer> first = list.stream().findFirst();
        if (first.isPresent()) {
            Integer result = first.get();
            System.out.println(result);       // 1
        } else {
            System.out.println("no value?");
        }

        Optional<Integer> first2 = list
                .stream()
                .filter(x -> x > 1).findFirst();

        if (first2.isPresent()) {
            System.out.println(first2.get()); // 2
        } else {
            System.out.println("no value?");
        }
    }

}

输出

1
2

1.2 获取Stream中第一个不等于node的元素。

Java8FindFirstExample2.java

package cc.myexample.java8;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Java8FindFirstExample2 {

    public static void main(String[] args) {

        List<String> list = Arrays.asList("node", "java", "python", "ruby");

        Optional<String> result = list.stream()
                .filter(x -> !x.equalsIgnoreCase("node"))
                .findFirst();

        if (result.isPresent()) {
            System.out.println(result.get()); // java
        } else {
            System.out.println("no value?");
        }

    }

}

输出

java

2. findAny()方法

2.1 该方法可以获取Stream中的任意一个元素。大多数时候如果我们运行下面这个程序,它的结果会是2,看起来像是findAny()总是返回第一个元素?但是它并不保证每次返回的都是第一个元素,尤其是在使用并发流的情况下,总之,findAny()方法可能返回Stream中的任意一个元素。

Java8FindAnyExample1.java

package cc.myexample.java8;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

public class Java8FindAnyExample1 {

    public static void main(String[] args) {

        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

        Optional<Integer> any = list.stream().filter(x -> x > 1).findAny();
        if (any.isPresent()) {
            Integer result = any.get();
            System.out.println(result);
        }

    }

}

输出

2 // 不保证

发表评论

电子邮件地址不会被公开。 必填项已用*标注