返回 Optional<Student> 或 Optional.empty()

问题描述 投票:-2回答:1

我在玩一下 Optional,了解一下它的工作原理。比如说我有这个班级,我想通过Id返回一个学生,或者如果找不到的话返回Optional.empty。

public class Student {
    private int id;
    private String name;

    public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我想用Id返回一个学生,如果找不到的话,就用Optional. empty来返回。这是我目前所拥有的。

public class Main {
    static List<Student> students = new ArrayList<>();

    public static void main(String[] args) {
        students.add(new Student(1, "name1"));
        students.add(new Student(2, "name2"));
        students.add(new Student(3, "name3"));

        System.out.println(getStudentById(1).get().getName());
    }

    public static Optional<Student> getStudentById(int id) {
        return students
                .stream()
                .filter( s -> s.getId() == id)
                .findFirst();
    }
}

但我想加上这一行:

.findFirst()
.orElse(Optional.empty());

然后我得到了这样的结果: Error:(23, 39) java: incompatible types: no instance(s) of type variable(s) T exist so that java.util.Optional conforms to com.company.Student.

另外,我想知道这样去看一个列表是否正确,我是说一个元素一个元素的看,还是有更好的方法?

java-8 optional
1个回答
1
投票

如果你读了javadocs的 流#findFirst() 你会发现你已经有了你需要的东西。

返回一个描述这个流的第一个元素的Optional,如果流是空的,则返回一个空的Optional。如果流没有遇到顺序,那么可以返回任何元素。

所以只需执行

return students
            .stream()
            .filter( s -> s.getId() == id)
            .findFirst();
© www.soinside.com 2019 - 2024. All rights reserved.