我有一个返回元素的Arraylist的方法。有时我需要整个列表,有时只是检查结果列表是否不为空(只是布尔值)。
由于该方法执行繁重的任务来检查是否应将某些内容添加到结果列表中,因此如果该方法向列表中添加了一个元素,是否有办法中断该方法?
我想使用相同的方法,但是如果将一个元素添加到列表中有时会中断,有时让它完成所有工作(并添加其他所有内容)。
我可以传递一些布尔标志,这些标志将指示在添加第一个元素事件时该方法是否应该中断,但是我想知道是否有更优雅的解决方案(使用流或其他方法)。
我以伪代码为例。此方法是递归的,如果我在第一次迭代中添加一个元素,我希望(可选)避免其他递归调用:
List<String> getData(argument) {
List<String> elements = new ArrayList<>;
... // do some heavy stuff that produces flag 'shouldAddElement'
if (shouldAddElement) {
elements.add('a');
}
if (someCondition) {
elements.addAll(getData(argument));
}
return elements;
}
您可以将谓词shouldContinue
(或什至等效地shouldStop
)传递给方法,并基于对谓词的评估,可以决定继续/停止。
但是,将此参数添加到公共方法似乎不太合适,因此您可以创建两个方法-一个方法在添加一个元素后停止,而另一个方法继续继续(因为无论如何,调用者都需要决定是否在一个元素之后停止还是要在一个元素之后停止?继续前进(如果您决定传递标志)-因此,您可能有两种方法(IMO)。
List<String> getOneElementData(argument) {
return getDataInternal(argument, elements -> elements.size < 1);
}
//You can even extend the above to take the desired final list size as a parameter
// and have the predicate as elements -> elements.size < desiredSize
List<String> getData(argument) {
return getDataInternal(argument, elements -> true); //Always keep going
}
private List<String> getDataInternal(argument, Predicate<List<String>> shouldContinue) {
List<String> elements = new ArrayList<>;
... // do some heavy stuff that produces flag 'shouldAddElement'
if (shouldAddElement) {
elements.add('a');
}
if (someCondition && shouldContinue.test(elements)) {
elements.addAll(getData(argument));
}
return elements;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句