我正在尝试创建一个泛型方法,通过函数设置一个字段,如下所示:
public static <T> void setFieldValue(T model, Function<T,String> field){
String name = "some name";
//What to do here as well
field.apply(model);
}
假设我有一个名为Person的类中的对象,其中包含一个名称字段,我想通过此方法使用lambda exprassion设置对象名称。我该怎么做?
Person person = new Person();
setFieldValue(person, p-> //What to do here?);
如果不可能,建议的方法是什么?
澄清
该字段的新值将在setFieldValue
内决定,我已编辑了我的代码
答案 0 :(得分:4)
试试这个。
public static <T> void set(T model, Consumer<T> consumer){
consumor.accept(model);
}
然后您可以按如下方式设置名称:
Person p = new Person();
set(p, p2 -> p2.setName("test"));
修改:用户更改了问题
尝试使用BiConsumer:https://docs.oracle.com/javase/8/docs/api/java/util/function/BiConsumer.html
答案 1 :(得分:2)
可能是这样的:
setFieldValue(person, (p) -> "");
(因为Function
的返回类型为String
)。
但是,如果您不需要返回类型,那么将Function
更改为Consumer
会更有意义:
public static <T> void set(T model, Consumer<T> consumor){
consumor.accept(model);
}
set(person, p -> { //something that returns void });
答案 2 :(得分:2)
好吧,Mr Madam
肯定不工作:它消耗Function<T,String>
而返回一个T
。您不需要返回任何内容的函数。你需要一个String
和T
并将一个放在另一个中。
所以String
会更好地满足您的需求:
BiConsumer<T,String>
然后您可以将其用作:
public static <T> void setFieldValue(T model, BiConsumer<T,String> consumer){
String name = "some name";
consumer.accept(model,name);
}
这意味着您有一个功能,可以接收任何人和姓名,并为该人提供该名称,并且符合setFieldValue(p, (person,name) -> person.setName(name) );
要求,因此当您致电BiConsumer
时,accept
将设置model
和person
将设置name
。