java使用者接口传递值

gev0vcfq  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(319)

我试图使用java消费者接口来摆脱冗余代码。我有这样一个物体:

public class Data {
    private int id;
    private String d1;
    private String d2;
    private String d3;
    private String d4;
}

@Getter
public class Container {
    private List<Data> data;
}

有几个函数可以这样更改数据对象的值:

public static void actionForD1(Container container) {
    container.getData().forEach(data -> {
        Source s = getSource(data.getId());
        String value = s.getValueForD1();
        //do maybe some more transformation with the value
        data.setD1(value);
    });
}

public static void actionForD2(Container container) {
    container.getData().forEach(data -> {
        Source s = getSource(data.getId());
        String value = s.getValueForD2();
        //do maybe some more transformation with the value
        data.setD2(value);
    });
}
...

他们都有相同的习惯。迭代数据对象,获取源对象并基于id进行一些计算。
现在是否可以使用java消费者接口来做这样的事情

process(container,  data -> {
    String value = s.getSomething();
    //do maybe some more stuff with value 
    data.setD2(value);
});

public static void process(Container container, Consumer<Data> c) {
    container.getData().forEach(data -> {
        Source s = getSource(data.getId());
        c(s);
    });
}

我的方法的问题是,源对象在使用者内部是不可访问的。有可能这样做吗?或者这是一个糟糕的方法?

pxiryf3j

pxiryf3j1#

我想你是在要求这样的东西:

public void takeAction(Container container, BiConsumer<Data, Source> op) {
    container.getData().forEach(data -> {
        Source s = getSource(data.getId());
        op.accept(data, s);
    });
}

BiConsumer<Data, Source> actionforD1 = (Data d, Source s) -> {
    String v = s.getValueForD1();
    // do maybe some more transformation with the value
    d.setD1(v);
};

BiConsumer<Data, Source> actionforD2 = (Data d, Source s) -> {
    String v = s.getValueForD2();
    // do maybe some more transformation with the value
    d.setD2(v);
};

public void businessLogic(Container c) {
    takeAction(c, actionforD1);
    takeAction(c, actionforD2);
}
scyqe7ek

scyqe7ek2#

您可以使用两个功能接口来提供 id 它是 Source 查找和实际设置 Data 待执行。

public static void action(
    Container container, Function<Data, Integer> idFunction, BiConsumer<Data, String> setter) 
{
    container.getData().forEach(data -> {
        Source s = getSource(idFunction.apply(data));
        String value = s.getSomething();
        setter.accept(data, value);
    });
}

使用相当灵活:

action(new Container(), Data::getId, Data::setD1);  // Source from data.id

Data externalData = ...
int id = externalData.getId();
action(new Container(), data -> id , Data::setD2);  // Source from external id

还要注意的是,在您的 actionForD2 方法,参数 data 不能在lambda表达式中使用,只要它已在方法参数级别定义。

相关问题