本文已参与「新人创作礼」活动,一起开启掘金创作之路。
在处理报文或导入数据时我经常遇到这种问题:某个参数由于是字典不可以直接存入,或者是某些参数需要进行特定的计算方式才可以存入, 这样的操作会将我的代码变得冗长繁杂,这时我就在想有没有一种简洁的方式去处理报文中需要进行复杂计算的方式。 经过查找之后我发现了java8下的forEach方法可以将函数变为参数的接口Consumer 这个接口官方的解释为:Represents an operation that accepts a single input argument and returns no result.Unlike most other functional interfaces, {@code Consumer} is expected to operate via side-effects. 大意是指接收单个参数且不返回结果,与大多数接口不同,预期通过副作用进行操作 接口下有两个方法: 1:accept 对给定的参数执行此操作。 也是我要使用的方法,可以将该方法实现当做参数传入 2:andThen 为default修饰的方法,可以执行一个组合,会按照顺序执行,在accept方法之后执行。 这次我主要用到accept方法 首先先写好处理报文的工具类
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.function.Consumer;
public class JsonFormatting {
public static JSONArray arrFormatting(String jsonStr, Consumer action){
if(!(jsonStr==null||jsonStr.equals("")||isArrayJson(jsonStr))) return null;
JSONArray jsonArray = splitJson(jsonStr);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
action.accept(jsonObject);
}
return jsonArray;
}
/**
* 提取json数组
* @param jsonStr
* @return
*/
private static JSONArray splitJson(String jsonStr){
return JSONArray.parseArray(jsonStr);
}
/**
* 识别是否是jsonArray
* @param jsonStr
* @return
*/
private static boolean isArrayJson(String jsonStr){
jsonStr = jsonStr.trim();
if (jsonStr.startsWith("[") && jsonStr.endsWith("]")) {
return true;
}
return false;
}
}
复制代码
接下来写调用
public class start {
static String testStr = "[{\n" +
" \"key\": \"test1\",\n" +
" \"value\": 123,\n" +
" \"type\": \"number\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述2\",\n" +
" \"children\": [" +
" {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" },"+
" {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" }"+
" ]\n" +
" }, {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" }]";
public static void main(String[] args) {
JSONArray a = JsonFormatting.arrFormatting(testStr,new Consumer<JSONObject>(){
@Override
public void accept(JSONObject test) {
String i = test.getString("key");
test.put("key",test.getString("type"));
test.put("type",i);
}
});
List<test> list = a.toJavaList(test.class);
list.forEach((v)->{
System.out.println(v.toString());
});
}
复制代码
完成了 感觉不够简洁,工具类加上泛型,调用时将Consumer与调用拆分 工具类
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class JsonFormatting{
public static <T> List<T> arrFormatting(String jsonStr, T t, Consumer action){
if(!(jsonStr==null||jsonStr.equals("")||isArrayJson(jsonStr))) return null;
JSONArray jsonArray = splitJson(jsonStr);
List<T> list = new ArrayList<T>();
jsonArray.forEach(v->{
T t1 = (T)JSONObject.parseObject(v.toString(),t.getClass());
action.accept(t1);
list.add(t1);
});
return list;
}
/**
* 提取json数组
* @param jsonStr
* @return
*/
private static JSONArray splitJson(String jsonStr){
return JSONArray.parseArray(jsonStr);
}
/**
* 识别是否是jsonArray
* @param jsonStr
* @return
*/
private static boolean isArrayJson(String jsonStr){
jsonStr = jsonStr.trim();
if (jsonStr.startsWith("[") && jsonStr.endsWith("]")) {
return true;
}
return false;
}
}
复制代码
调用
import java.util.List;
import java.util.function.Consumer;
public class start {
static String testStr = "[{\n" +
" \"key\": \"test1\",\n" +
" \"value\": 123,\n" +
" \"type\": \"number\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述2\",\n" +
" \"children\": [" +
" {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" },"+
" {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" }"+
" ]\n" +
" }, {\n" +
" \"key\": \"test2\",\n" +
" \"value\": 345,\n" +
" \"type\": \"boolean\",\n" +
" \"required\": \"true\",\n" +
" \"description\": \"字段描述4\",\n" +
" \"children\": []\n" +
" }]";
static Consumer consumer = new Consumer<test>() {
@Override
public void accept(test test) {
String i = test.getKey();
test.setKey(test.getType());
test.setType(i);
}
};
public static void main(String[] args) {
List<test> a = JsonFormatting.arrFormatting(testStr, new test(),consumer);
a.forEach((v)->{
System.out.println(v.toString());
});
}
}
复制代码
测试
搞定,这样写出来的代码简洁又优雅