如何在Java中创建链接方法

时间:2018-11-05 17:46:18

标签: java fluent

我有一个类负责控制在运行时创建的对象-它像DAO一样根据摆动帧的输入来构建它们。它具有删除已创建对象的方法:

public void removeFrom(Class<?> clazz, int index) {
    for (Map.Entry<String, Object> entry : modelsMap.entrySet()) {
        if (entry.getKey().equals(clazz.getSimpleName())) {
            ((ArrayList<Object>) entry.getValue()).remove(index);
        }
    }
}

我希望不调用此方法并传递引用的类和索引,而是希望该方法的调用像这样:dao.removeFrom(MyObject.class).at(myIndex);猜猜它看起来像Stream API使用的链接方法。很高兴有人能帮助我!

3 个答案:

答案 0 :(得分:2)

在这种情况下,您的removeFrom()方法应该返回围绕((ArrayList<Object>) entry.getValue())的包装器。并且该包装器必须具有方法at(int index),该方法将删除给定索引的元素。

当您的modelsMap没有给定clazz的条目时,您还需要考虑极端情况。

答案 1 :(得分:0)

请检查Builder设计模式。尝试为没有属性,getter和setter的简单对象创建构建器设计模式。

一旦您能够做到这一点,方法链接将变得非常清晰。 :)

答案 2 :(得分:0)

您可以引入一个DaoRemover类,您可以通过工厂方法实例化该类,并且该实例方法可以返回当前实例。

例如:

public class DaoRemover {
    private Map<String, Object> modelsMap; // your actual data
    private final List<ArrayList<Object>> list; // list of list after filtering on the class


    public static DaoRemover of(Class<?> clazz) {
        return new DaoRemover(clazz);
    }

    private DaoRemover(Class<?> clazz) {
        list = modelsMap.entrySet()
                        .stream()
                        .filter(e -> e.getKey()
                                      .equals(clazz.getSimpleName()))
                        .map(e -> (ArrayList<Object>) e.getValue())
                        .collect(toList());
    }

    public DaoRemover at(int index) {
        list.forEach(l -> l.remove(index));
        return this;
    }

}

您现在可以这样做:

DaoRemover.of(MyObject.class)
          .at(myIndex); 

DaoRemover.of(MyObject.class)
          .at(myIndex) 
          .at(myOtherIndex);