2017-10-11 22 views
4

下面的代码获取流并对其进行排序。如果存在应该应用的最大限制,它将应用它。Java流根据条件限制收集元素

if(maxLimit > 0) { 
    return list.stream().sorted(comparator).limit(maxLimit).collect(Collectors.toList()); 
} else { 
    return list.stream().sorted(comparator).collect(Collectors.toList()); 
} 

//maxLimit, list, comparator can be understood in general terms. 

在这里,如果在内部,限制操作存在,否则它不存在。其他在线操作相同。

当maxLimit大于零时,有什么办法可以应用限制吗?在上面提供的代码块中,重复相同的逻辑,除了一个块中的限制操作。

+0

难道这是与Java 9'做效率低下takeWhile()'?我想答案是否定的,因为takeWhile在流中操作并且是无状态的....!? – schneida

回答

5
list.stream().sorted(comparator).limit(maxLimit>0 ? maxLimit: list.size()).collect(Collectors.toList()) 

纵观目前实施限制的,我相信它会检查,看是否限制为小于当前大小,因此不会像我最初的预期

+1

正确和一个很酷的想法,我个人会与@ szymon-stepniak解决方案,因为它更容易阅读,仍然简洁... – schneida

+0

谢谢。简洁的代码。想要的解决方案是指出这个问题。 – Shashi

11

您可以像拆你的代码部分:

final Stream stream = list.stream() 
     .sorted(comparator); 

if (maxLimit > 0) { 
    stream = stream.limit(maxLimit); 
} 

return stream.collect(Collectors.toList()); 

在这种情况下,你就不必维护两个分支,因为它是在你最初的例子。

另外,当分配stream变量时,值得使用特定的泛型类型,例如,如果listList<String>,则使用Stream<String>类型作为stream变量。

+0

虽然代码被拆分,但流上的操作只有一次。即使代码被拆分,也需要在列表中进行单个操作。这个解决方案很好。 – Shashi