使用Java 8 Optional <T>,Stream循环遍历包含真实布尔字段值的对象列表

S34*_*34N 1 java lambda optional java-8 java-stream

我被告知不要.anyMatch(Predicate.isEqual(true))被同事使用.原因是,它不是无效的.他们建议我应该使用Optional<Boolean>.

我有一个帐户列表,我想true只有在帐户有未偿还的活跃贷款时才返回布尔值,否则返回false.

@Data
public class Account {
    private String accountNumber;
    @Getter(AccessLevel.NONE)
    private Boolean activeLoan;
    private String accountReference;
    private Double balance;
    private String status;

    public Boolean hasActiveLoan() {
        return activeLoan;
    }
}
Run Code Online (Sandbox Code Playgroud)

换句话说,只有当hasActiveLoan()等于真时.

以下是我提出的解决方案:

 Boolean checkActiveLoanRule(List<Account> accounts) {

         Optional<Boolean> loanAccountExists = Optional.of(accounts.stream()
                .map(Account::hasActiveLoanAccount)
                .anyMatch(Predicate.isEqual(true)));

         return loanAccountExists.equals(Optional.of(true));
     }
Run Code Online (Sandbox Code Playgroud)

这可以重构以某种方式改进吗?还有其他想法吗?

最重要的是,这样的解决方案是线程安全的吗?

shm*_*sel 6

你的同事错了.Predicate.isEqual()是安全的.您可以通过阅读文档,运行测试或检查源来进行验证.

至于Stream.anyMatch(),它返回一个原语boolean,开头不能为null.