我正在努力寻找一种方法将其分发给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对象传递到某个地方。有人知道这种模式吗?
答案 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));
}