这getAllFields
实施是非常低效率,创建多个ArrayList
实例和数组,重复地在它们之间来回复制整个数据。值得庆幸的是,阶级层级很少深刻,这成为一个瓶颈。
不过,你可以用一个直接的循环,这是更简单,更高效的实现这一点:
public static Field[] getAllFields(Class<?> klass) {
List<Field> fields = new ArrayList<>();
for(; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
return fields.toArray(new Field[0]);
}
没有从这里使用递归半点好处。
有了一个循环,你可以轻松地创建一个Function
如果你真的想:
public void init(){
Function<Class<?>,Field[]> f = klass -> {
List<Field> fields = new ArrayList<>();
for(; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
return fields.toArray(new Field[0]);
};
Field[] someFields = f.apply(SomeClass.class);
}
虽然,当然,竟然没有把环路成Function
在所有的理由。由于希望使用低效的递归实现,因此您只想在此处有一个函数,但lambda表达式根本不支持访问它们。他们只能访问字段,实现功能接口的实例已存储到该实例中,如果存储在您不想要的字段中,那么它们就是。用本地lambda表达式,递归是不可能的。
有了直接的循环,你可以只写
public void init(){
List<Field> fields = new ArrayList<>();
for(Class<?> klass=SomeClass.class; klass!=null; klass=klass.getSuperclass())
Collections.addAll(fields, klass.getDeclaredFields());
Field[] someFields = fields.toArray(new Field[0]);
}
不过,实际上,很少有针对fields
内容复制到阵列中的真正的原因,你可以只用List<Field>
工作,而不是。这就是说,将循环封装到描述其目的的命名方法中,如getAllFields
,实际上是一件好事。如果您不想公开它,请将其声明为private
而不是public
。
目标是什么?混淆你的代码?有很多情况下使用lambdas是有用的,但这实际上不是其中之一。 –
请显示您尝试过的内容,并解释您遇到的问题。 – shmosel
我不同意,我认为一旦你的整个代码逻辑被封装在1个方法中,它就更容易维护 – Benma