我在玩一下 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.
另外,我想知道这样去看一个列表是否正确,我是说一个元素一个元素的看,还是有更好的方法?
如果你读了javadocs的 流#findFirst() 你会发现你已经有了你需要的东西。
返回一个描述这个流的第一个元素的Optional,如果流是空的,则返回一个空的Optional。如果流没有遇到顺序,那么可以返回任何元素。
所以只需执行
return students
.stream()
.filter( s -> s.getId() == id)
.findFirst();