//创建一个数据源 多个stds 对象组成的json数组
String strs="[ { \"stdid\": \"1\", \"score\": \"20\", \"ts\": \"2019-11-15 13:30:10\" }, { \"stdid\": \"2\", \"score\": \"22\", \"ts\": \"2019-11-15 13:31:08\" }, { \"stdid\": \"3\", \"score\": \"20.2\", \"ts\": \"2019-11-14 13:31:20\" }, { \"stdid\": \"4\", \"score\": \"25\", \"ts\": \"2019-11-15 13:33:27\" }, { \"stdid\": \"5\", \"score\": \"20\", \"ts\": \"2019-11-13 13:33:36\" }, { \"stdid\": \"6\", \"score\": \"21.2\", \"ts\": \"2019-11-15 13:33:47\" }, { \"stdid\": \"7\", \"score\": \"26\", \"ts\": \"2019-11-15 13:37:05\" }, { \"stdid\": \"8\", \"score\": \"29\", \"ts\": \"2019-11-15 13:37:31\" }, { \"stdid\": \"9\", \"score\": \"30\", \"ts\": \"2019-11-19 13:37:38\" }, { \"stdid\": \"10\", \"score\": \"12\", \"ts\": \"2019-11-15 13:37:58\" }, { \"stdid\": \"11\", \"score\": \"15\", \"ts\": \"2019-11-22 13:38:04\" }, { \"stdid\": \"12\", \"score\": \"15\", \"ts\": \"2019-11-11 13:38:04\" } ]";
// 通过GSON 解析成List,也可以通过fastjson进行解析成数组
Gson gson=new Gson();
JsonParser parser = new JsonParser();
final JsonElement parse = parser.parse(strs);
final JsonArray asJsonArray = parse.getAsJsonArray(); //解析成json数组
List<Stds> stds=new ArrayList<>();
asJsonArray.forEach(jsonElement -> {
stds.add(gson.fromJson(jsonElement, Stds.class));
});
//数据源整理好之后,下面就是正式的流处理实战了
// (小试牛刀一波)需求: 取 在时间2019-11-15 13:37:31之前的连续5条数据(按时间排序)的分数前三的平均数
//1.先根据时间排序降序(),
final double average = stds.stream().
sorted(Comparator.comparing(Stds::getTs).
reversed()).
filter(stds2 -> stds2.getTs().getTime() < Timestamp.valueOf("2019-11-15 13:37:31").getTime()).
limit(5).
sorted(Comparator.comparing(Stds::getScore).reversed()).
limit(3).
mapToDouble(e -> e.getScore()).summaryStatistics().getAverage();
System.out.println(average);
// collector 处理完流得到的是Stream对象,一般我们会转为集合
final List<Stds> collect = stds.stream().collect(Collectors.toList());
System.out.println(collect.toString());