有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个方法返回元素的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;
}

共 (1) 个答案

  1. # 1 楼答案

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

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

    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;
    }