当数字等于0时,如何跳过流的limit(number)调用?


19

我有一些Java代码可以提供来自的对象items。它基于maxNumber

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

它可以正常工作,但是问题是:当maxNumber == 0?时,是否有一种跳过限制的方法?

我知道我可以这样做:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

但是,也许有更好的方法,您想到什么了吗?

Answers:


15

我想

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

会成功的,因为您极不可能处理包含2 ^ 63-1个元素的流...

至少要谨慎使用并行流... API文档中的注释说:

API注意:虽然limit()通常在顺序流管道上进行便宜的操作,但在有序并行管道上可能会非常昂贵,尤其是对于maxSize大的值 ...


是的,成功了,谢谢!
randomuser1

20

不,流管道不允许实际跳过管道的任何部分,因此您不得不在步骤内部使用条件逻辑(包括limit()始终在管道中)进行操作,或者将流构建为比问题中的if / else更为清晰(IMHO)

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

在像这里这样的简单情况下,它并没有太大的区别,但是您经常会看到常规代码集合通过方法传递,转换为流然后返回到集合。在这种情况下,直到真正需要使用部分流可能是一个更好的主意collect()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.