如果没有匹配项,从ArrayList进行流传输将返回空错误

时间:2018-09-29 16:29:34

标签: java stream java-stream

我有一个按钮,当单击该按钮时,它会循环通过ArrayList<User>,并尝试将emailText文本与对象getEmail()匹配。

btnLogin = new JButton("Login");
btnLogin.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
    User declaredUser = App.getUsers().stream()
        .filter(o -> o.getEmail().equalsIgnoreCase(emailText.getText())).findFirst().get()); 

当电子邮件确实存在并且.get()返回declaredUser时,它可以正常工作。但是,如果没有匹配项,则会收到此错误:

  

线程“ AWT-EventQueue-0”中的异常java.util.NoSuchElementException:不存在值

我尝试像这样添加!= null

User declaredUser;
if ((declaredUser = App.getUsers().stream()
        .filter(o -> o.getEmail().equalsIgnoreCase(emailText.getText())).findFirst().get()) != null) {
    // Code here ...
}

但是,我仍然收到此错误。谁能指出正确的方向,以便首先检查findFirst()是否返回值?谢谢

1 个答案:

答案 0 :(得分:4)

如您所见,如果Optional#get为空,则NoSuchElementException抛出Optional<T>;基于这个原因,我不建议您完全调用它,尤其是因为您不知道Optional<T>是否为空。

由于Stream#findFirst返回Optional<T>,因此您可以使用Optional#ifPresent仅在Optional<T>为空时继续执行:

App.getUsers()
   .stream()
   .filter(o -> o.getEmail().equalsIgnoreCase(emailText.getText()))
   .findFirst()
   .ifPresent(declaredUser -> {
        // declaredUser is in scope here!
    });