转自:https://zhuanlan.zhihu.com/p/36865573
1 取最后一条数据
stream对象存在方法findFirst,我们可以很方便的取到第一条数据,但它却没有findLast方法,需要取到最后一条数据,我们可以将数组逆序,然后再取最后一条数据:
JSONArray jsonArray = JSONArray.parseArray("[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]");
JSONObject jsonObject = (JSONObject)jsonArray.stream().sorted((a,b) -> -1).findFirst().get();
System.out.println(jsonObject);
/**
* out :
* {"date":"2016-01-01","sex":"woman","name":"liming"}
**/
2 清空json对象中的某个数组(该数组位于JSON对象内部多层)
SONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
jsonObject.forEach((key, val) -> {
JSONObject obj = (JSONObject) val;
JSONArray array = obj.getJSONArray("childrens");
array.clear();
obj.put("childrens",array);
});
System.out.println(jsonObject);
/**
* out :
* {"1":{"childrens":[],"sex":"man","name":"maple"}}
**/
3 收集对象属性重新成一个数组
有时候我们需要对对象进行再次拼装以形成我们方便使用的数据状态:
JSONArray jsonArray = JSONArray.parseArray("[{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}]");
jsonArray = jsonArray.stream().map(obj -> {
JSONObject returnObj = new JSONObject();
JSONObject jsonObj = (JSONObject)obj;
jsonObj.forEach((key,val) -> {
returnObj.put(key,((JSONObject)val).getJSONArray("childrens"));
});
return returnObj;
}).collect(Collectors.toCollection(JSONArray::new));
System.out.println(jsonArray);
/**
* out :
* [{"1":[{"date":"2018-01-01","sex":"man","name":"草根"},{"date":"2017-01-01","sex":"woman","name":"merry"},{"date":"2016-01-01","sex":"woman","name":"liming"}]}]
**/
4 过滤数据并按时间字符串排序
JSONObject jsonObject = JSONObject.parseObject("{\"1\": {\"name\":\"maple\",\"sex\":\"man\",\"childrens\":[{\"name\":\"草根\",\"sex\":\"man\",\"date\":\"2018-01-01\"},{\"name\":\"merry\",\"sex\":\"woman\",\"date\":\"2017-01-01\"},{\"name\":\"liming\",\"sex\":\"woman\",\"date\":\"2016-01-01\"}]}}");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Comparator<Object> dateComparator = (a, b) -> {
int result = 0;
try {
Date dt1 = df.parse(((JSONObject)a).getString("date"));
Date dt2 = df.parse(((JSONObject)b).getString("date"));
result = dt1.compareTo(dt2);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
return result;
}
};
jsonObject.forEach((key, val) -> {
JSONObject obj = (JSONObject) val;
if (obj.getJSONArray("childrens") != null) {
JSONArray array = obj.getJSONArray("childrens");
array = array.stream().filter(arrObj -> !"merry".equals(((JSONObject) arrObj).getString("name")))
.sorted(dateComparator)
.collect(Collectors.toCollection(JSONArray::new));
obj.put("childrens", array);
} else {
obj.put("childrens", new JSONArray());
}
});
System.out.println(jsonObject);
/**
* out :
* {"1":{"childrens":[{"date":"2016-01-01","sex":"woman","name":"liming"},{"date":"2018-01-01","sex":"man","name":"草根"}],"sex":"man","name":"maple"}}
**/