Java 8 空签入流筛选器
我有一个学生对象列表Java 8 空签入流筛选器,java-8,java-stream,Java 8,Java Stream,我有一个学生对象列表studentList,如下所示 Student1 = new Student("Student1", 10); Student2 = new Student("Student2", 11); Student { String name; int age; } 我想在列表上做一个筛选,得到特定学生的年龄。 我使用Java8流尝试了与下面相同的方法 int age = studentList.stream() .
studentList
,如下所示
Student1 = new Student("Student1", 10);
Student2 = new Student("Student2", 11);
Student {
String name;
int age;
}
我想在列表上做一个筛选,得到特定学生的年龄。
我使用Java8流尝试了与下面相同的方法
int age = studentList.stream()
.filter(x -> x.getName.equals("Student1"))
.findFirst()
.get()
.getAge();
但是当我传递一个不在列表中的学生名时,比如Student5,它将抛出一个空指针异常。对于这一点,我给出了空检查,如下所示
Student s = studentList.stream()
.filter(x -> x.getName.equals("Student1"))
.findFirst()
.get();
if(s != null){
age = s.getAge();
}
与其像这样拆分此空检查,是否可以在stream().filter()代码本身中容纳空检查?首先,如果
getName
返回空值,请反转测试。equals方法应该在进行比较之前检查null。然后添加一个条件,以防与该学生不匹配
int age = studentList.stream()
.filter(x -> "Student1".equals(x.getName()))
.mapToInt(Student::getAge).findFirst().orElse(0);
修改我的答案是基于一个非常好的建议,以减少
装箱
开销。首先,如果getName
返回空值,请反转测试。equals方法应该在进行比较之前检查null。然后添加一个条件,以防与该学生不匹配
int age = studentList.stream()
.filter(x -> "Student1".equals(x.getName()))
.mapToInt(Student::getAge).findFirst().orElse(0);
根据的一个极好的建议修改了我的答案,以减少装箱
开销。Stream#findFirst
返回可选
如果存在可以重新映射的值:
int age = studentList.stream()
.filter(x -> "Student1".equals(x.getName()))
.findFirst()
.map(Student::getAge)
.orElse(0);
Stream#findFirst
返回可选值
如果存在,可以重新映射哪个值:
int age = studentList.stream()
.filter(x -> "Student1".equals(x.getName()))
.findFirst()
.map(Student::getAge)
.orElse(0);
空可选项上的
get()
将抛出NoSuchElementException
,而不是NullPointerException
。当没有学生匹配时,这不是您想要的完整情况?get()
空可选项将抛出NoSuchElementException
,不是NullPointerException
。当没有学生匹配时,这不是您想要的完整情况?您可以使用int age=studentList.stream().filter(x->“Student1.equals(x.getName()).mapToInt(student::getAge).findFirst()或lse(0)避免装箱开销通过使用int age=studentList.stream().filter(x->“Student1.equals(x.getName())).mapToInt(Student::getAge.findFirst().orElse(0),可以避免装箱开销代码>