需要帮助优化以下代码
Need help in optmizing the following code
我正在使用 google 番石榴库从提到的包中递归获取所有 类 并遍历所有 public 方法并获取它们的参数。然后 "mapOfpackageMethodParameters" 将传递给 gson 对象,它将给我 json.
有什么方法可以通过使用 lambda 或 java8 流 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"
}
}
}
您可以将每个 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));
我正在使用 google 番石榴库从提到的包中递归获取所有 类 并遍历所有 public 方法并获取它们的参数。然后 "mapOfpackageMethodParameters" 将传递给 gson 对象,它将给我 json.
有什么方法可以通过使用 lambda 或 java8 流 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"
}
}
}
您可以将每个 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));