2017-10-11 50 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