gpt4 book ai didi

Java 使用 lambda 表达式对一个对象中的字段求和

转载 作者:行者123 更新时间:2023-12-01 19:49:45 27 4
gpt4 key购买 nike

我有这样的对象:

class DailyReport{
LocalDate day;
Long criticalErrors;
Long browserErrors;
Long OtherErrors;
}

现在我得到了这个对象的列表,并想创建summaryobject,即

class Summary{
LocalDate startDate;
LocalDate endDate;
Long sumOfCritical;
Long sumOfBrowser;
Long sumOfOthers
}

我创建了这样的东西:

List<DailyReport> dailyReports=repository.findAll();
Summary summary = new Summary(
dailyReports.get(0).getDay;
dailyReports.get(dailyReports.size() - 1).getDay;
summary.stream().mapToLong(DailyReport::getCriticalErrors).sum(),
summary.stream().mapToLong(DailyReport::getBrowserErrors).sum(),
summary.stream().mapToLong(DailyReport::getOtherErrors).sum(),
}

但对我来说,它看起来效率很低 - 有没有更好的方法来做到这一点?

最佳答案

您可以通过实现将报表“添加”到摘要对象的逻辑以及组合两个摘要对象的逻辑来减少流。

看起来是这样的:

//Adds a report to a summary
BiFunction<Summary, DailyReport, Summary> reportMerger = (summ, rep1) -> {
Summary summary = new Summary();

summary.setStartDate(rep1.getDay().isAfter(summ.getStartDate()) ?
rep1.getDay() : summ.getStartDate());
summary.setEndDate(rep1.getDay().isAfter(summ.getEndDate()) ?
summ.getEndDate() : rep1.getDay());
summary.setSumOfCritical(rep1.getCriticalErrors()
+ summ.getSumOfCritical());
summary.setSumOfBrowser(rep1.getBrowserErrors()
+ summ.getSumOfBrowser());
summary.setSumOfOthers(rep1.getOtherErrors()
+ summ.getSumOfOthers());

return summary;
};

//combines 2 summary objects
BinaryOperator<Summary> summaryMerger = (s1, s2) -> {
Summary summ = new Summary();

summ.setStartDate(s1.getStartDate().isBefore(s2.getStartDate()) ?
s1.getStartDate() : s2.getStartDate());
summ.setEndDate(s1.getEndDate().isBefore(s2.getEndDate()) ?
s2.getEndDate() : s1.getEndDate());

summ.setSumOfCritical(s1.getSumOfCritical()
+ s2.getSumOfCritical());
summ.setSumOfBrowser(s1.getSumOfBrowser()
+ s2.getSumOfBrowser());
summ.setSumOfOthers(s1.getSumOfOthers()
+ s2.getSumOfOthers());

return summ;
};

然后将一系列报告简化为一个摘要

Summary summary = dailyReports.stream()
.reduce(new Summary(), reportMerger, summaryMerger);

注意:您需要在上面的比较中为 new Summary() 的 null 字段添加 null 检查(以避免 NPE)。

<小时/>

另一种收集方式(感谢尤金的评论),消除了对新对象的需要:

Summary summaryTwo = dailyReports.stream().collect(Collector.of(Summary::new, 
(summ, rep) -> {
//add rep to summ
}, (summary1, summary2) -> {
//merge summary2 into summary1
return summary1;
}));

关于Java 使用 lambda 表达式对一个对象中的字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51876555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com