java - 使用 java 8 流求平均值
问题描述
我是 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 每 3 小时将有大约 100 个 jsonObject 和数据。我实际上需要使用 java 8 流或使用其他 java 8 功能分别找到 min 和 max 的平均值和 top 的平均值。另一个标准是最小值和最大值平均值应基于白天或晚上。如果 dt 包含 06:00 或 09:00 或 12:00 或 15:00,则它应该是 dayavg(白天的最小值 + 最大值),否则它应该是夜间平均值((夜间的最小值 + 最大值))。顶部不取决于白天或黑夜。任何帮助表示赞赏
下面是使用 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;
解决方案
您可以使用自定义enum
:
static enum Type { DAY, NIGHT, TOP }
然后收集两次你的清单:
// Day and night
Map<Type, Double> result = list.stream()
.collect(
Collectors.groupingBy(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")){
return Type.DAY;
}
if(dt.contains("18:00:00")|| dt.contains("21:00:00") || dt.contains("00:00:00") || dt.contains("03:00:00")){
return Type.NIGHT;
}
// Should not happen
return null;
},
Collectors.averagingInt(node -> node.get("core").get("min").asInt() + node.get("core").get("max").asInt()))
);
// Top
result.putAll(
list.stream().collect(
Collectors.groupingBy(node -> Type.TOP,
Collectors.averagingInt(node -> node.get("core").get("top").asInt()))
)
);
推荐阅读
- javascript - 三.js 创建镜像 VS。钢材对材料的影响?
- c++ - std::span 迭代器可以比创建它们的 span 对象更长寿吗?
- r - 将周数更改为已过去的周数,而不是一年中的周数
- python - 使用函数的 Python HangMan 游戏
- elasticsearch - Elasticsearch COUNT() 文本字段
- powershell - 我可以使用正则表达式通过 CTRL+R 反向搜索来搜索 PowerShell 命令历史记录吗?
- shopify - Shopify 订阅,但直到第二个计费周期才开始
- javascript - 当我试图在我的详细信息页面上返回每家餐厅的详细信息时,我得到了无法读取未定义的属性“name_restaurant”
- parsing - Parsec 自定义 while 循环解析器只解析循环体中的一条语句
- python - 烧瓶 | 如何将丢失的(404)资产文件夹连接到从引导工作室导出的 html