This question already has answers here:
Why is this java Stream operated upon twice?
(4个答案)
3年前关闭。
我想在流API中实现分页。
我使用了if语句来修改流,但是当我遇到时感到惊讶
这是我的代码
这是我的Foo.class
这是对该搜索方法的示例调用
本身不执行任何操作。它返回一个新的
一般来说,您只能对一个操作使用
尽管仍然会使您的代码尴尬,但是您可以做的是编写
(4个答案)
3年前关闭。
我想在流API中实现分页。
我使用了if语句来修改流,但是当我遇到时感到惊讶
java.lang.IllegalStateException: stream has already been operated upon or closed
这是我的代码
@Override
public List<Foo> search(String[] names, Integer offset, Integer size) {
final Stream<Foo> fooStream = findAllFoos().stream();
if(offset!=null) {
fooStream
.skip(offset)
.limit(size);
}
if(ArrayUtils.isNotEmpty(names)) {
fooStream.filter(foo -> ArrayUtils.contains(names, foo.getName()));
}
final List<Foo> foos = fooStream.collect(Collectors.toList()); //this lines throws the exception, according to stacktrace
return foos;
}
这是我的Foo.class
public class Foo {
private String name;
//..setters and getters
}
这是对该搜索方法的示例调用
fooService.search(fooNamesArray, 0, 1);
fooService.search(fooNamesArray, null, null);
最佳答案
fooStream.skip(offset)
本身不执行任何操作。它返回一个新的
Stream
;它不会修改fooStream
。一般来说,您只能对一个操作使用
Stream
,尽管这可能是对另一个Stream
的转换。尽管仍然会使您的代码尴尬,但是您可以做的是编写
fooStream = fooStream.skip(offset).limit(size)
。09-25 22:04