我有简单的数据结构
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
中的第一个)。
我进行了一些测试,可以在数据库中切换这些值,仅当我请求列表中的第一个值时,我才会获得肯定的结果。另一个以消息“找不到帐户”结束。
答案 0 :(得分:6)
似乎您应该这样做
.filter(a -> a.getAccountNumber().equals(inputData.getAccountNumber()))
.findAny();
您当前最终使用的是Optional.filter
,它会根据谓词(如果存在)来过滤使用Optional
的唯一findAny()
。
您应该使用Stream.filter
而不是后者来过滤内容流,然后可以对它使用findAny()
来获取Optional
值。