java使用流根据第二个列表中的值更新一个列表中的对象
我有两个相应的列表:
public class BookOverallData {
private Long idOfBook;
private String title;
private String authour;
private BigDecimal basePrice;
private Integer discountRate;
}
public class TimeDiscount {
private Long idOfBook;
private Integer discountRate;
}
Set<BookOverallData> booksToReturn
Set<TimeDiscount> actualPromotions
目标是对折扣进行求和,这意味着将actualPromotions
中的discountRate
添加到booksToReturn
列表中的discountRate
值。两个列表中的对象可以通过idOfBook
匹配
我就是这样解决的
booksToReturn.forEach(
p -> {
final Optional<TimeDiscount> promotion = actualPromotions.stream().filter(ap -> Objects.equals(ap.getIdOfBook(), p.getIdOfBook())).findFirst();
promotion.ifPresent(ap -> p.setDiscountRate(ap.getDiscountRate() + p.getDiscountRate()));
}
);
我只是在探索溪流,我认为我的解决方案很笨拙。您将如何使用流和函数方法以更优雅的方式解决这个问题
# 1 楼答案
我首先创建一个从
TimeDiscount::getIdOfBook
到TimeDiscount
的映射:然后我会:
或者如果出于某种原因想继续使用
Optional
这改进了
actualPromotions.stream()
中对booksToReturn
的每个元素的低效查找# 2 楼答案
一种方法是使用:
假设
actualPromotion.getIdOfBook()
和p.getIdOfBook()
在Set
中是唯一的# 3 楼答案
我没有对此进行测试: 试试这个
然后将此地图用于:
尝试在
BookOverallData
类中声明一个新方法