将多个if语句转换为调度函数

时间:2015-01-08 22:18:35

标签: java function java-8 dispatch

我正在努力寻找一种方法将其分发给java8中的函数

    Person p = registry.getPerson();

    if (field == Field.LASTNAME) {
        p.setLastName(str);
    }
    if (field == Field.FIRSTNAME) {
        p.setFirstName(str);
    }
    if (field == Field.MIDDLENAME) {
        p.setMiddleName(str);
    }

我的想法是在更多情况下使用某种函数调度表来替换if语句:

Map<Integer, Function> map = new HashMap<Integer, Function>  
static {
    map.put(1, new Function<String, String>() {
        @Override
        public Object apply(String str) {
            person.setLastName(str);
            return str;
        }
    }
}

但是代码无法编译,因为我需要将person对象传递到某个地方。有人知道这种模式吗?

2 个答案:

答案 0 :(得分:4)

假设Field是枚举,您可以将BiConsumer<Person,String>添加为枚举字段:

class Person {

    static enum Field {
        FIRSTNAME(Person::setFirstName),
        MIDDLENAME(Person::setMiddleName),
        LASTNAME(Person::setLastName)
        ;

        private BiConsumer<Person, String> setter;

        private Field(BiConsumer<Person, String> setter) {
            this.setter = setter;
        }
    }

    public void set(Field field, String str) {
        field.setter.accept(this, str);
    }

    ......
}

答案 1 :(得分:2)

您可以存储Function<String,String>而不是存储BiFunction<Person,String,String>,并将Person实例作为参数传递。

Map<Integer, BiFunction<Person,String,String>> map = 
        new HashMap<Integer, BiFunction<Person,String,String>>();  
static {
    map.put(1, (person, str)->person.setLastName(str));

}

为了简单起见,您还可以存储List个函数,如果您只是按整数对它们进行索引,则随机访问速度更快,并且对于不太复杂的通用代码:

List<BiFunction<Person,String,String>> list = new ArrayList<BiFunction<Person,String,String>>();  
static {
    list.add((person, str)->person.setLastName(str));
}