gpt4 book ai didi

java - 使用 java 8 流查找平均值

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:55 25 4
gpt4 key购买 nike

我是 Java 8 的新手,仍处于学习阶段。我必须使用 java 8 编写以下逻辑。我有一个 Json 数组数据,我的 json 结构如下。

{"list":[{"core":{"min":281.556,"max":286.67,"top":972.73},"dt":"2017-02-16 12:00:00"},{"core":{"min":281.821,"max":285.66,"top":970.91},"dt":"2017-02-16 15:00:00"},{"core":{"min":274.498,"max":277.05,"top":970.44},"dt":"2017-02-16 18:00:00"},{"core":{"min":271.503,"max":272.78,"top":969.32},"dt":"2017-02-16 21:00:00"}]}

这个 jsonArray 将包含大约 100 个 jsonObject,其中包含每 3 小时的数据。我实际上需要使用 java 8 流或使用其他 java 8 功能分别找到最小值和最大值的平均值以及顶部的平均值。另一个标准是最小和最大平均值应基于白天或夜晚。如果 dt 包含 06:00 或 09:00 或 12:00 或 15:00,它应该是 dayavg(白天的最小值+最大值)或者它应该是夜间平均值((夜间的最小值+最大值))。 Top 不分昼夜。任何帮助表示赞赏

下面是使用 java 7 的登录。需要使用 Java 8 的功能。

int dayavg=0;
int nightavg = 0;
int topavg=0;
int day=0;
int night = 0;
int top=0;
for(int i=0;i<50;i++){
JsonNode node = list.get(i);
String dt = node.get("dt").textValue();
if(dt.contains("06:00:00")|| dt.contains("09:00:00") || dt.contains("12:00:00") || dt.contains("15:00:00")){
int val = node.get("core").get("min").asInt() + node.get("core").get("max").asInt();
day = day + val;
}
if(dt.contains("18:00:00")|| dt.contains("21:00:00") || dt.contains("00:00:00") || dt.contains("03:00:00")){
int val = node.get("core").get("min").asInt() + node.get("core").get("max").asInt();
night = night + val;
}
int val = node.get("core").get("top").asInt();
top = top + val;
}
topavg = top/50;
dayavg = day/100;
nightavg = night/100;

最佳答案

制作你自己的收集器

如果你只想拥有一个流,你可以做你自己的收集器

有两个像这样的 POJO:

class Values {
int top,day,night;
}

class Avg {
int topAvg,dayAvg,nightAvg;
}

收集器看起来像这样:

    BinaryOperator<Values> combiner = (left,right) -> {
left.day+=right.day;
left.night+=right.night;
left.top+=right.top;
return left;
};

Function<Values,Avg> finisher =(value)->{
Avg avg = new Avg();
avg.topAvg = value.top/50;
avg.dayAvg = value.day/100;
avg.nightAvg = value.night/100;
return avg;
};


BiConsumer<Values,JsonNode> accumulator= (values, node) ->{
String dt = node.get("dt").textValue();
if(dt.contains("06:00:00")|| dt.contains("09:00:00") || dt.contains("12:00:00") || dt.contains("15:00:00")){
int val = node.get("core").get("min").asInt() + node.get("core").get("max").asInt();
values.day += val;
}
if(dt.contains("18:00:00")|| dt.contains("21:00:00") || dt.contains("00:00:00") || dt.contains("03:00:00")){
int val = node.get("core").get("min").asInt() + node.get("core").get("max").asInt();
values.night += val;
}
int val = node.get("core").get("top").asInt();
values.top += val;
};

Avg avg = list.stream()
.collect(Collector.of(Values::new, accumulator,combiner,finisher));

按值使用一个流

您还可以使用多个流并为 dayAvg 设置类似的东西:

   OptionalDouble dayAvg = list.stream()
.filter(node -> {
String dt = node.get("dt").textValue();
return dt.contains("06:00:00") || dt.contains("09:00:00") || dt.contains("12:00:00") || dt.contains("15:00:00");
})
.mapToInt(node -> node.get("core").get("min").asInt() + node.get("core").get("max").asInt())
.average();

我认为它更清晰,但它可能会降低方法的性能

关于java - 使用 java 8 流查找平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52465973/

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