自从接触了stream流对象之后,我习惯于使用流对象进行List的处理,在最近的一段业务开发中,用到的JSON操作比较多,而com.alibaba.fastjson下的JSONObject,JSONArray本质上来说其实是map和list,仅以记录其一部分流操作;
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对象内部多层)
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\"}]}}");
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"}}
**/