Потоковое из ArrayList возвращает нулевую ошибку, если нет совпадения - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть кнопка, которая при нажатии циклически перебирает 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 голосов
/ 29 сентября 2018

Как вы видели, 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!
    });
...