我的课.

class MyLoan {
    private Long loanId;
    private BigDecimal loanAmount;
    private BigDecimal totalPaid;
    ....
}
class Customer {
    private Long loanId;
    private List<MyLoan> myLoan;
}

我想迭代Customer中的myLoan,然后计算totalPaid.

我的逻辑是"如果loanId23491L23492L,那么将这两个loanId中的loanAmount相加,并将totalPaid的值设置为loanId 23490L".totalPaid的值是always showing as zero,我的逻辑如下.

想要使用Java8流,但在使用流时无法写入多个条件.

BigDecimal spreadAmount;
for (MyLoan myloan: customer.getMyLoan()) {
    if (myloan.getLoanId() == 23491L || myloan.getLoanId() == 23492L) {
        spreadAmount = spreadAmount.add(myloan.getLoanAmount());
    }
    if (myloan.getLoanId() == 23490L) {
        myloan.setTotalPaid(spreadAmount);
    }
}

推荐答案

totalPaid字段未被修改,因为id为23490l的MyLoan实例在其他两个MyLoan实例之前遇到.

正如@Silvio Mayolo在 comments 中所建议的,您应该首先使用一个临时变量计算总量,然后将其分配给id为23490l的MyLoan实例的totalPaid字段.

这是您try 执行的流实现:

//If to make sure that the element MyLoan invoking the setter is actually present
if (myLoan.stream().map(MyLoan::getLoanId).anyMatch(value -> value == 23490l)){
    myLoan.stream()
            .filter(loan -> loan.getLoanId() == 23490l)
            .findFirst()
            .get()
            .setTotalPaid(myLoan.stream()
                    .filter(loan -> loan.getLoanId() == 23491l || loan.getLoanId() == 23492l)
                    .map(MyLoan::getLoanAmount)
                    .reduce(BigDecimal.valueOf(0), (a, b) -> a = a.add(b)));
}

WARNING

如果列表中不存在id为23490l的MyLoan,则在通过终端操作findFirst()检索的Optional上调用的方法get()可以抛出NoSuchElementException.您应该首先确保元素存在,就像我在if语句中所做的那样.

第二种(糟糕的做法)可能包括接住get()投出的NoSuchElementException,以防所需的MyLoan不存在.正如 comments 中指出的,捕捉RuntimeException(NoSuchElementException是它的一个子类)是一种糟糕的做法,因为我们应该调查问题的根源,而不是简单地捕捉异常.老实说,第二种方法是(懒惰的)最后手段,只是为了展示另一种可能的处理方式.

Java相关问答推荐

Java Streams在矩阵遍历中的性能影响

我的scala文件失败了Scala.g4 ANTLR语法

如何在返回bigint []值的子查询中使用any?

替换com. sun. jndi. dns. DnsContextFactory Wildfly23 JDK 17

JVM会优化这个数学运算吗?

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

RichFaces 3.x-Spring Boot-迁移web.xml

Java 21虚拟线程执行器的性能比池化操作系统线程的执行器差?

Java中实现的归并排序算法给出ArrayIndexOutOfBound异常

Java:使用Class.cast()将对象转换为原始数组

Spring和可编辑";where";@Query

声明MessageChannel Bean的首选方式

每次FXMLLoader调用ApplationConext.getBean(类)时创建@Component的新实例

无法播放音频:从资源加载库GStreamer-Lite失败

将stringBuilder + forloop转换为stream + map

如何使这两种方法合二为一?

如何使用jooq更新记录?

spring 更新多项管理关系

具有 DayOfWeek 列表的 JPA 实体

单例模式中热切初始化和惰性初始化的区别