我正在使用google guava库从所提到的包中递归获取所有类,并迭代所有公共方法并获取其参数。 " mapOfpackageMethodParameters"然后将传递给gson对象,这将给我json。
有没有办法可以使用lambdas或java8 stream api优化两个最里面的for循环。任何其他建议??
String[] packagenames = { "com.example" };
LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> mapOfpackageMethodParameters = new LinkedHashMap<>();
for (String packagename : packagenames) {
List<ClassInfo> clazzList = ClassPath.from(ClassLoader.getSystemClassLoader())
.getTopLevelClassesRecursive(packagename).stream().filter(c -> c.getPackageName().endsWith("test"))
.collect(Collectors.toList());
for (ClassInfo class1 : clazzList) {
List<Method> methodList = Arrays.asList(Class.forName(class1.getName()).getMethods());
LinkedHashMap<String, LinkedHashMap<String, String>> methodMap = new LinkedHashMap<>();
for (Method method : methodList) {
List<Parameter> parameterList = Arrays.asList(method.getParameters());
LinkedHashMap<String, String> parameterMap = parameterList.stream()
.collect(Collectors.toMap(param -> param.getName(), param -> param.getType().toString(),
(x, y) -> x, LinkedHashMap::new));
methodMap.put(method.getName(), parameterMap);
}
mapOfpackageMethodParameters.put(class1.getName(), methodMap);
}
}
这是从上面代码中预期和生成的最终json。
{
"com.example.test.dummyclass": {
"sampletest1": {
"dummyargument1": "class java.lang.String",
"dummyargument2": "class java.lang.String"
},
"sampletest2": {
"dummyargument1": "class java.lang.String",
"dummyargument2": "class java.lang.Integer"
}
}
}
答案 0 :(得分:0)
您可以将每个for..each
循环转换为收集到LinkedHashMap
的流。使整个操作非常实用。
String[] packageNames = { "com.example" };
LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<String, String>>> mapOfpackageMethodParameters = Arrays
.stream(packageNames)
.flatMap(packageName -> ClassPath
.from(ClassLoader.getSystemClassLoader())
.getTopLevelClassesRecursive(packageName)
.stream())
.filter(classInfo -> classInfo.getPackageName().endsWith("test"))
.map(ClassInfo::load)
.collect(Collectors.toMap(
Class::getName,
clazz -> Arrays
.stream(clazz.getMethods())
.collect(Collectors.toMap(
Method::getName,
method -> Arrays
.stream(method.getParameters())
.collect(Collectors.toMap(
Parameter::getName,
param -> param.getType().toString(),
(x, y) -> x, LinkedHashMap::new)),
(x, y) -> x, LinkedHashMap::new)),
(x, y) -> x, LinkedHashMap::new));