Lambda 自定义函数接口摘要统计信息
我有一个基本的SpringBoot应用程序。使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎和作为可执行JAR文件的包 我想基于POJO创建一个自定义SummaryStatistics,该POJO有两个字段:price和updateDate。此统计信息应获得最低/最高价格以及该最低/最高价格的日期Lambda 自定义函数接口摘要统计信息,lambda,java-8,functional-programming,java-stream,functional-interface,Lambda,Java 8,Functional Programming,Java Stream,Functional Interface,我有一个基本的SpringBoot应用程序。使用Spring初始值设定项、JPA、嵌入式Tomcat、Thymeleaf模板引擎和作为可执行JAR文件的包 我想基于POJO创建一个自定义SummaryStatistics,该POJO有两个字段:price和updateDate。此统计信息应获得最低/最高价格以及该最低/最高价格的日期 public class MenuPriceSummaryStatistics implements Consumer<MenuPrice> {
public class MenuPriceSummaryStatistics implements Consumer<MenuPrice> {
private long count;
private double sum;
private double sumCompensation; // Low order bits of sum
private double simpleSum; // Used to compute right sum for non-finite inputs
private double min = Double.POSITIVE_INFINITY;
private double max = Double.NEGATIVE_INFINITY;
private Date maxDate;
private Date minDate;
public MenuPriceSummaryStatistics() {
}
/**
* Combines the state of another {@code DoubleSummaryStatistics} into this one.
*
* @param other
* another {@code DoubleSummaryStatistics}
* @throws NullPointerException
* if {@code other} is null
*/
public void combine(MenuPriceSummaryStatistics other) {
count += other.count;
simpleSum += other.simpleSum;
sumWithCompensation(other.sum);
sumWithCompensation(other.sumCompensation);
min = Math.min(min, other.min);
max = Math.max(max, other.max);
if (min==other.min) {
minDate=other.minDate;
}
if (max==other.max) {
maxDate=other.maxDate;
}
}
@Override
public void accept(MenuPrice cp) {
++count;
simpleSum += cp.getPrice();
sumWithCompensation(cp.getPrice());
min = Math.min(min, cp.getPrice());
max = Math.max(max, cp.getPrice());
if (min==cp.getPrice()) {
minDate=cp.getUpdateDate();
}
if (max==cp.getPrice()) {
maxDate=cp.getUpdateDate();
}
}
private void sumWithCompensation(double value) {
double tmp = value - sumCompensation;
double velvel = sum + tmp; // Little wolf of rounding error
sumCompensation = (velvel - sum) - tmp;
sum = velvel;
}
public final long getCount() {
return count;
}
public final double getSum() {
// Better error bounds to add both terms as the final sum
double tmp = sum + sumCompensation;
if (Double.isNaN(tmp) && Double.isInfinite(simpleSum))
// If the compensated sum is spuriously NaN from
// accumulating one or more same-signed infinite values,
// return the correctly-signed infinity stored in
// simpleSum.
return simpleSum;
else
return tmp;
}
public final double getMin() {
return min;
}
public final double getMax() {
return max;
}
public Date getMaxDate() {
return maxDate;
}
public Date getMinDate() {
return minDate;
}
public final double getAverage() {
return getCount() > 0 ? getSum() / getCount() : 0.0d;
}
@Override
public String toString() {
return "MenuPriceSummaryStatistics [count=" + count + ", sum=" + sum + ", sumCompensation="
+ sumCompensation + ", simpleSum=" + simpleSum + ", min=" + min + ", max=" + max + ", maxDate="
+ maxDate + ", minDate=" + minDate + "]";
}
}
我得到一个错误,因为我应该定义方法.summaryStatistics()代码>
我试着定义这个类
public interface MenuPriceStream extends BaseStream<MenuPrice, MenuPriceStream> {
..
}
您可以将类与3参数collect
一起使用:
MenuPriceSummaryStatistics statistics = menuPrices.stream()
.collect(
MenuPriceSummaryStatistics::new,
MenuPriceSummaryStatistics::accept,
MenuPriceSummaryStatistics::combine
);
您可能需要定义一个收集器
public static Collector<MenuPrice, ?, MenuPriceSummaryStatistics> menuPriceSummary() {
return Collector.of(
MenuPriceSummaryStatistics::new,
MenuPriceSummaryStatistics::accept,
(a, b) -> {a.combine(b); return a;},
Collector.Characteristics.IDENTITY_FINISH
);
}
是否可能是您错误地将方法声明粘贴到了方法体中?正确,抱歉:-)
Multiple markers at this line
- Syntax error, insert "[ ]" to complete Dimension
- Syntax error, insert ";" to complete LocalVariableDeclarationStatement
- Syntax error on token "menuPriceSummary", AnnotationName expected after this
token
MenuPriceSummaryStatistics statistics = menuPrices.stream()
.collect(
MenuPriceSummaryStatistics::new,
MenuPriceSummaryStatistics::accept,
MenuPriceSummaryStatistics::combine
);
public static Collector<MenuPrice, ?, MenuPriceSummaryStatistics> menuPriceSummary() {
return Collector.of(
MenuPriceSummaryStatistics::new,
MenuPriceSummaryStatistics::accept,
(a, b) -> {a.combine(b); return a;},
Collector.Characteristics.IDENTITY_FINISH
);
}
MenuPriceSummaryStatistics s = menuPrices.stream().collect(menuPriceSummary());