繁体   English   中英

仅当列表的第一个元素相等时,Stream才返回对象

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM