Java8 - 从obj匹配搜索条件获取实例变量值列表(字段名称列表)

时间:2018-02-18 14:40:44

标签: java java-8

我有一个包含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 reflectionhttps://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',我可以从地图中获取必填字段列表, 现在如何从对象和枚举中获取值以形成响应?

1 个答案:

答案 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);
}

如果你可以避免使用这么大的物体,那么它会大大简化你的代码。