首发于 实用Java

Java 8 Stream filter方法和Optional对象结合简化代码方法

java 8 stream api 中的filter方法用于筛选出集合中符合条件的元素

比如找到用户集合中名称叫王五的元素,代码如下

public class Main {
    private static class User {
        private int id;
        private String name;
        public User(int id, String name) {
            this.id = id;
            this.name = name;
        public int getId() {
            return id;
        public String getName() {
            return name;
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(
                new User(1, "张三"),
                new User(2, "李四"),
                new User(3, "王五")
        List<User> found = userList.stream()
                .filter( ite -> ite.name.equals("王五"))
                .collect(Collectors.toList());
}

found变量就是筛选的结果

接着我们要使用这个元素,如果元素存在则直接取出,如果不存在,则自己创建一个,一般我们会这么去实现

        User user;
        if( found.size() > 0 ) {
            user = found.get(0);
        } else {
            user = new User(3,"王五");
        }

或者

User user = found.size() > 0 ? found.get(0) : new User(3,"王五");

这两种方法是通过条件分支去实现,当然, 不是说它们不好,事实上在java 8之前也只能这么用,但是在java 8之后却有更好的方法可以用

        Optional<User> optionalUser = userList.stream()
                .filter( it -> it.name.equals("王五"))
                .findAny();