有 Java 编程相关的问题?

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

java在中间操作中使用收集的结果可能存在哪些问题?

考虑下面的场景,其中一个中间操作关注先前操作中的哪一个成功。

// isSelected -> method that returns a boolean on whether the current source is selected
List<String> selectedSources = new ArrayList<>();
sources.stream()
    .map(source -> Pair.of(source, isSelected(source, selectedSources)))
    .filter(pair -> pair.isRight())
    .map(pair -> pair.getLeft())
    .collect(Collectors.toCollection(() -> selectedSources));

在这个场景中,我们没有真正的功能,我们在中间步骤之一使用终端收集的结果。这是可行的,但违背了java流和函数式编程的一些基本原则。对于这是否是良好做法,或者是否应该避免,是否有任何一般性指导


共 (1) 个答案

  1. # 1 楼答案

    通常对现有集合使用.collect不是一个好做法。通常,你应该收集到一个新的集合中

    虽然如果仍要修改现有集合(这可能会导致并发问题),但可以使用.forEach

    List<String> selectedSources = new ArrayList<>();
    sources.stream()
           .filter(source -> isSelected(source, selectedSources))
           .forEach(selectedSources::add);
    

    由于您正在编写修改现有集合的“没有真正功能的”代码,因此没有理由在这里强制使用Stream API方法

    IMHO、增强的for循环和嵌套的if语句在您的情况下可以做得很好。代码更具可读性:

    List<String> selectedSources = new ArrayList<>();
    for (String source : sources) {
        if (isSelected(source, selectedSources)) {
            selectedSources.add(source);
        }
    }