【问题标题】:Streaming from ArrayList returns null error if no match如果不匹配,则从 ArrayList 流式传输返回 null 错误
【发布时间】:2018-09-29 16:29:34
【问题描述】:

我有一个按钮,当单击该按钮时,它会循环通过 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() 返回值的正确方向?谢谢

【问题讨论】:

    标签: java stream java-stream


    【解决方案1】:

    如您所见,如果 Optional<T> 为空,Optional#get 会抛出 NoSuchElementException;出于这个原因,我根本不建议调用它,尤其是因为您不知道 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!
        });
    

    【讨论】:

    • 感谢 Jacob,这解决了我的问题!我会尽可能接受答案,我也非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    相关资源
    最近更新 更多