java8 stream对象探索(1)(JSONObject和JSONArray操作) 您所在的位置:网站首页 stream处理数据后可以不收集吗 java8 stream对象探索(1)(JSONObject和JSONArray操作)

java8 stream对象探索(1)(JSONObject和JSONArray操作)

2024-02-17 16:13| 来源: 网络整理| 查看: 265

自从接触了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 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"}} **/

 

原文地址:https://zhuanlan.zhihu.com/p/36865573 

https://blog.csdn.net/banqgg/article/details/86625695

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有