我有一个包含30个实例变量的对象,具体取决于一个实例变量 例如:
if obj.var1 == 'A' : Get 5 variable values
else if obj.var1 == 'B' : Get another 5 variable values
我将条件映射到obj中的必填字段 例如:
A -> {FieldName1, FieldName2, FieldName3}
B -> {FieldName1, FieldName3, FieldName5, FieldName7}
反射会给我实例变量的值,如何用java8以有效的方式实现这一点。
我的推文很少:Get the class instance variables and print their values using reflection,https://codereview.stackexchange.com/questions/108222/getting-a-list-of-all-fields-in-an-object
例如:测试模拟代码
public class Test {
private String var1;
private String var2;
private String var3;
private String var4;
private String var5;
private String var6;
private String var7;
private String var8;
private String var9;
private String var10;
// getters and setters
public Test() {
}
public static void main(String[] args) {
Test obj = new Test();
// Assume all ins variables are set with some value
List resp = new ArrayList();
if(obj.var1 == "A") {
resp.add(obj.var2 + DescriptionEnum.Var2); // Also Here I need to get the variable description from enum)
resp.add(obj.var3 + DescriptionEnum.);
resp.add(obj.var7 + DescriptionEnum.);
resp.add(obj.var8 + DescriptionEnum.);
}
else if(obj.var1 == "B") {
resp.add(obj.var1 + DescriptionEnum.);
resp.add(obj.var2 + DescriptionEnum.);
resp.add(obj.var9 + DescriptionEnum.);
resp.add(obj.var10 + DescriptionEnum.);
}
}
而不是上面的if-else,我想到了将条件和字段列表放在hashmap中并进行操作 例如:
map.put("A1", new String[]{'fieldName1', 'fieldName2'})
map.put("B1", new String[]{'fieldName1', 'fieldName2'})
因此,如果obj.var1 ==' A',我可以从地图中获取必填字段列表, 现在如何从对象和枚举中获取值以形成响应?
答案 0 :(得分:3)
import java.util.List;
import java.util.Map;
import java.util.function.Function;
class Big {
String director;
String a;
String b;
String c;
String d;
String e;
String f;
String g;
}
public class Ex2 {
Map<String, Function<Big, List<String>>> mappers = Map.of(
"A", a -> List.of(a.a, a.b),
"B", a -> List.of(a.c, a.d)
);
public List<String> parse(Big input) {
return mappers.get(input.director).apply(input);
}
}
上面的代码使用Java 9中的Map.of和List.of来提高可读性,如果你想使用Java 8这样做,你可以像这样交换它们:
Map<String, Function<Big, List<String>>> mappers = new HashMap<String, Function<Big, List<String>>>() {
{
put("A", a -> Arrays.asList(a.a, a.b));
put("B", a -> Arrays.asList(a.c, a.d));
}
};
public List<String> parse(Big input) {
return mappers.get(input.director).apply(input);
}
如果你可以避免使用这么大的物体,那么它会大大简化你的代码。