通过函数设置字段

时间:2017-01-05 13:54:16

标签: java

我正在尝试创建一个泛型方法,通过函数设置一个字段,如下所示:

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内决定,我已编辑了我的代码

3 个答案:

答案 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。您不需要返回任何内容的函数。你需要一个StringT并将一个放在另一个中。

所以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将设置modelperson将设置name