使用stream api修改传递的参数

xan*_*key 1 java java-stream

我有关于范围,流和重新分配的问题.

我想知道是否有办法使用流式api执行此操作而无需重新分配列表.重新分配参数的问题是它打破了范围,因此测试没有看到新值.

我知道还有其他方法(迭代器,向后迭代等)来解决问题.这个问题只是出于好奇.

测试代码:

@Test
void testAllNegativesByIterator() {
    List<Integer> values = new ArrayList<>(Arrays.asList(-1, -2, -3, -4, -5, -6, -7, -8, -9));
    p.removeNegativesByIterator(values);
    checkNonNegativeSize(0, values);
}
Run Code Online (Sandbox Code Playgroud)

被测代码:

public void removeNegativesByStream(List<Integer> values) {
    values = values.stream().filter(v -> v > 0).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我也明白我可以返回一个值.正如我在问题中所说的那样,我特意要求一种方法来利用好奇心来实现这一点.

Ous*_* D. 6

首先,重新分配流查询的结果values将不会在方法调用后持久存在,因为java不支持按引用传递.

至于问题:

您可以使用Collection::removeIf删除源集合中满足给定谓词的所有元素的方法:

values.removeIf(v -> v <= 0);
Run Code Online (Sandbox Code Playgroud)

否则,您别无选择,只能创建新列表,因为流不会修改源.