This question already has answers here:
Why is this java Stream operated upon twice?
                                
                                    (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