Java8 Stream.filter()方法使用教程

作者 | 2020年4月23日

在本教程中将会给你演示几个关于Java8中Stream的使用实例,这些实例包括filter()collect()findAny()orElse()等方法的使用。

实例1:filter()与collect()

在Java8之前,需要使用这样的方法来过滤一个列表:

BeforeJava8.java

package cc.myexample.java8;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class BeforeJava8 {

    public static void main(String[] args) {

        List<String> lines = Arrays.asList("spring""node""myexample");
        List<String> result = getFilterOutput(lines, "myexample");
        for (String temp : result) {
            System.out.println(temp);    // 输出: spring, node
        }

    }

    private static List<String> getFilterOutput(List<String> lines, String filter) {
        List<String> result = new ArrayList<>();
        for (String line : lines) {
            if (!"myexample".equals(line)) { // 不需要myexample
                result.add(line);
            }
        }
        return result;
    }

}

输出

spring
node

而在Java8中则可以使用Stream.filter()过滤List然后使用Stream.collect()转换Stream为List。

NowJava8.java

package cc.myexample.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class NowJava8 {

    public static void main(String[] args) {

        List<String> lines = Arrays.asList("spring""node""myexample");

        List<String> result = lines.stream()                // 转List为Stream
                .filter(line -> !"myexample".equals(line))     // 不需要myexample
                .collect(Collectors.toList());              // 转换Stream为List

        result.forEach(System.out::println);                //输出 : spring, node

    }

}

输出

spring
node

实例2:filter()、findAny()和orElse()

Person.java

package cc.myexample.java8;

public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //getters setters, toString
}

在Java8之前,你可以通过下面这个方法实现按名字获取一个Person:

BeforeJava8.java

package cc.myexample.java8;

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

public class BeforeJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("myexample"30),
                new Person("jack"20),
                new Person("lawrence"40)
        );

        Person result = getStudentByName(persons, "jack");
        System.out.println(result);

    }

    private static Person getStudentByName(List<Person> persons, String name) {

        Person result = null;
        for (Person temp : persons) {
            if (name.equals(temp.getName())) {
                result = temp;
            }
        }
        return result;
    }
}

输出

Person{name='jack', age=20}

在Java8中则可以使用Stream.filter()方法过滤List,然后使用.findAny().orElse(null)来返回结果。

NowJava8.java

package cc.myexample.java8;

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

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("myexample"30),
                new Person("jack"20),
                new Person("lawrence"40)
        );

        Person result1 = persons.stream()                        // 转Stream为List
                .filter(x -> "jack".equals(x.getName()))        // 找到name为Jack的Person
                .findAny()                                      // 如果存在找到则返回
                .orElse(null);                                  // 未找到则返回null

        System.out.println(result1);

        Person result2 = persons.stream()
                .filter(x -> "ahmook".equals(x.getName()))
                .findAny()
                .orElse(null);

        System.out.println(result2);

    }

}

输出

Person{name='jack', age=20}
null

使用多个条件过滤。

NowJava8.java

package cc.myexample.java8;

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

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("myexample"30),
                new Person("jack"20),
                new Person("lawrence"40)
        );

        Person result1 = persons.stream()
                .filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge())
                .findAny()
                .orElse(null);

        System.out.println("result 1 :" + result1);

        // 这样也可以
        Person result2 = persons.stream()
                .filter(p -> {
                    if ("jack".equals(p.getName()) && 20 == p.getAge()) {
                        return true;
                    }
                    return false;
                }).findAny()
                .orElse(null);

        System.out.println("result 2 :" + result2);

    }
}

输出

result 1 :Person{name='jack', age=20}
result 2 :Person{name='jack', age=20}

实例3:filter()与map()

package cc.myexample.java8;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class NowJava8 {

    public static void main(String[] args) {

        List<Person> persons = Arrays.asList(
                new Person("myexample"30),
                new Person("jack"20),
                new Person("lawrence"40)
        );

        String name = persons.stream()
                .filter(x -> "jack".equals(x.getName()))
                .map(Person::getName)                        // 把Peroson转为String
                .findAny()
                .orElse("");

        System.out.println("name : " + name);

        List<String> collect = persons.stream()
                .map(Person::getName)
                .collect(Collectors.toList());

        collect.forEach(System.out::println);

    }

}

输出

name : jack

myexample
jack
lawrence

发表评论

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