有条件地对流应用限制-“流已被操作或关闭”

时间:2019-10-22 13:31:50

标签: java java-stream

我需要对流有条件地应用limit(Integer)操作。我的第一种方法是(试图避免终端操作):

Stream<CustomerDetailsEntity> resultStream = aList
        // filter ...
        .stream().filter(c -> distinctPartnerNumber.add(c.getPartnerNumber()));
if (limit != null) {
    resultStream.limit(limit);
}
return resultStream.collect(toList());

如果应用限制,则产生stream has already been operated upon or closed。限制是“终端操作”吗?

搜索stream has already been operated upon or closed建议使用供应商,但与此同时,我无法重用供应商:

Supplier<Stream<CustomerDetailsEntity>> resultStreamSup =()-> aList
        // filter ...
        .stream().filter(c -> distinctPartnerNumber.add(c.getPartnerNumber()));
if (limit != null) {
    resultStreamSup = () -> resultStreamSup.get.limit(limit); //COMPILE ERROR, due to supplier is not final
}

...

那么如何有条件地正确应用限制(我想像往常一样避免使用多个return语句)?

2 个答案:

答案 0 :(得分:1)

您忽略了limit()的返回值。

该名称应为resultStream = resultStream.limit(limit);,因为原始流不会被调用修改。

  

返回由该流的元素组成的流,被截断   长度不得超过{@code maxSize}。

答案 1 :(得分:1)

除了没有重新分配值的现有错误外,您还可以将现有代码修改为更具可读性:

return aList
        .stream()
        .filter(c -> distinctPartnerNumber.add(c.getPartnerNumber()))
        .limit(Optional.ofNullable(limit).orElse(aList.size())) // handling null here
        .collect(Collectors.toList());