Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 空签入流筛选器_Java 8_Java Stream - Fatal编程技术网

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),可以避免装箱开销