我有一个类负责控制在运行时创建的对象-它像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使用的链接方法。很高兴有人能帮助我!
答案 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);