Stream возвращает объект, только если первый элемент списка равен - PullRequest
0 голосов
/ 22 сентября 2018

Я получил простую структуру данных

private InMemoryDataBase() {
    Account account1 = new Account("222", "222");
    account1.getPlayers().add(new Player("john"));
    account1.getPlayers().add(new Player("rachel"));
    Account account2 = new Account("111", "111");
    account2.getPlayers().add(new Player("max"));
    accounts.add(account1);
    accounts.add(account2);
}

public class Account {
    private String accountNumber;
    private String password;
    private List<Player> players;

    public Account(String accountNumber, String password){
        this.accountNumber = accountNumber;
        this.password = password;
        players = new ArrayList<>();
    }
}

И метод, который находит Account, если существует

 private Optional<Account> findAccount() {
        return dataBase.getAccounts()
                .stream().findAny()
                .filter(a -> a.getAccountNumber()
                        .equals(inputData.getAccountNumber()));
    }

, а затем простую логику, связанную с этим

public void process() {
        Optional<Account> account = findAccount();
        if(account.isPresent()) {
           if(validatePassword(account.get().getPassword())) {               
               outputData = new PlayersList(ConnectionInfo.Source.SERVER, inputData.getSourceID(), players);
           } else {
               outputData = new Message(ConnectionInfo.Source.SERVER, inputData.getSourceID(), "Incorrect password");
           }
        } else {
            outputData = new Message(ConnectionInfo.Source.SERVER, inputData.getSourceID(), "Account not found");
        }
    }

Короче говоря, это часть связи клиент-сервер, inputData - это данные, отправленные из клиентского приложения.И это похоже на работу, но только если я введу accountNumber равным «222» (первый в InMemoryDataBase.accounts.

Я провел некоторое тестирование, я могу переключить эти значения в своей базе данных, яЯ получу положительный результат только в том случае, если я запрошу первый в списке, а другой получит сообщение «Аккаунт не найден».

1 Ответ

0 голосов
/ 22 сентября 2018

Кажется, что вместо этого вы должны делать

.filter(a -> a.getAccountNumber().equals(inputData.getAccountNumber()))
.findAny();

То, что вы в конечном итоге используете, это Optional.filter, который фильтрует единственное Optional, которое вы используетеfindAny(), основываясь на предикате, если значение существует.

Вместо которого вы должны использовать Stream.filter, который фильтрует поток контента, а затем вы можете использовать findAny() чтобы получить значение Optional.

...