我有关于范围,流和重新分配的问题.
我想知道是否有办法使用流式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)
编辑:
我也明白我可以返回一个值.正如我在问题中所说的那样,我特意要求一种方法来利用好奇心来实现这一点.
首先,重新分配流查询的结果values将不会在方法调用后持久存在,因为java不支持按引用传递.
至于问题:
您可以使用Collection::removeIf删除源集合中满足给定谓词的所有元素的方法:
values.removeIf(v -> v <= 0);
Run Code Online (Sandbox Code Playgroud)
否则,您别无选择,只能创建新列表,因为流不会修改源.