Java列表流,获取所有元素还是仅获取一个?

Java列表流,获取所有元素还是仅获取一个?,java,recursion,java-8,Java,Recursion,Java 8,我有一个方法返回元素的Arraylist。 有时我需要整个列表,有时只是检查结果列表是否为空(只是bool) 由于该方法需要执行一些繁重的任务来检查是否应该将某些内容添加到结果列表中,因此有没有方法 如果方法向列表中添加一个元素,请打断该方法 我希望使用相同的方法,但有时在列表中添加一个元素时会中断,有时会让它完成所有工作(并添加所有其他内容) 我可以传递一些布尔标志,这些标志将指示当添加了第一个元素事件时该方法是否应该中断, 但我想知道是否有一个更优雅的解决方案(流或其他…) 我添加了伪代码作

我有一个方法返回元素的Arraylist。 有时我需要整个列表,有时只是检查结果列表是否为空(只是bool)

由于该方法需要执行一些繁重的任务来检查是否应该将某些内容添加到结果列表中,因此有没有方法 如果方法向列表中添加一个元素,请打断该方法

我希望使用相同的方法,但有时在列表中添加一个元素时会中断,有时会让它完成所有工作(并添加所有其他内容)

我可以传递一些布尔标志,这些标志将指示当添加了第一个元素事件时该方法是否应该中断, 但我想知道是否有一个更优雅的解决方案(流或其他…)

我添加了伪代码作为示例。此方法是递归的,如果在第一次迭代中添加元素,我希望(可选)避免额外的递归调用:

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;
}
List getData(参数){
列表元素=新的ArrayList;
…//做一些会产生“shouldAddElement”标志的繁重工作
如果(应添加元素){
元素。添加('a');
}
如果(某些条件){
addAll(getData(参数));
}
返回元素;
}

您可以将谓词
shouldContinue
(甚至等效地
shouldStop
)传递给该方法,并根据谓词的计算结果决定继续/停止

但是,将此参数添加到公共方法似乎不太合适,因此您可以创建两个方法—一个在添加一个元素后停止,另一个继续(因为无论如何,调用方需要决定是在一个元素后停止还是继续(如果您决定传递标志)-因此,您很可能有两种方法(IMO)

列出getOneElementData(参数){
返回getDataInternal(参数,elements->elements.size<1);
}
//您甚至可以扩展上述参数,以获取所需的最终列表大小作为参数
//并将谓词设置为elements->elements.sizetrue);//始终保持
}
私有列表getDataInternal(参数,谓词shouldContinue){
列表元素=新的ArrayList;
…//做一些会产生“shouldAddElement”标志的繁重工作
如果(应添加元素){
元素。添加('a');
}
if(someCondition&&shouldContinue.test(元素)){
addAll(getData(参数));
}
返回元素;
}

它不是很优雅。但您可以利用列表是可变的这一事实。
请参见以下简单示例:

List<String> list = new ArrayList<>();
list.add("A");  list.add("B");  list.add("C");
manipulateList(list);
System.out.println(list);
操作后的打印输出为:

[A、B、C、D]

请注意,您没有使用方法返回值。它返回无效。通过这种方式,您可以获得被操纵的列表,而无需您的方法返回它。
现在,使
manufactualList
返回一个
boolean
,您可以根据需要使用它。比如:

boolean manipulateList(List<String> list, boolean stopOnconditionMet) {

    while (...) {//represents the long process

        if(conditionMet && stopOnconditionMet ) {
            return true;
        }
    }

    return false
} 
boolean操纵列表(列表,boolean stopOnconditionMet){
而(…){//代表了一个漫长的过程
if(条件满足和停止条件满足){
返回true;
}
}
返回错误
} 
您还可以添加一个方便的方法:

List<String> manipulateList(List<String> list) {
    manipulateList(list, false);
    return list;
}
列表操作列表(列表){
操纵列表(列表,错误);
退货清单;
}

需要当前代码才能理解您的问题。请您再解释一下,这是一个比我发布的更好的解决方案+1(我认为要求
getOneElementData
返回
boolean
boolean manipulateList(List<String> list, boolean stopOnconditionMet) {

    while (...) {//represents the long process

        if(conditionMet && stopOnconditionMet ) {
            return true;
        }
    }

    return false
} 
List<String> manipulateList(List<String> list) {
    manipulateList(list, false);
    return list;
}