![](/img/trans.png)
[英]Stream min() and max() method in Lambda Expression with Comparator , returns first and last element only does not return min/max element
[英]Stream returns object only if first element of list is equal
我有简单的数据结构
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");
}
}
简而言之,这是Client-Server通信的一部分, inputData
是从客户端应用程序发送的数据。 它似乎工作,但只有当我输入accountNumber等于“222”( InMemoryDataBase.accounts
第一个)。
我做了一些测试,我可以在我的数据库中切换这些值,只有当我请求列表中的第一个时,我才会得到肯定的结果。 另一个最终会收到“未找到帐户”的消息。
看起来你应该这样做
.filter(a -> a.getAccountNumber().equals(inputData.getAccountNumber()))
.findAny();
什么您目前结束了使用是Optional.filter
它过滤的唯一Optional
您使用得findAny()
如果该值存在,基于谓词。
而不是你应该使用在内容流中过滤的Stream.filter
,然后你可以使用findAny()
来获取Optional
值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.