[英]How to get the min/max element of nested collections without redundant code using streams?
例如:
給定一個Set<Set<Integer>>
,我嘗試使用
int min = nestedSets.stream().map(s->s.stream().min(Comparator.naturalOrder()).get()).min(Comparator.naturalOrder()).get();
我最初的想法是使用flatMap
,但是它不會返回所需的結果。
您可以將元素收集到IntSummaryStatistics
中,即:
A state object 用於收集計數、最小值、最大值、總和和平均值等統計信息。
例如:
Set<Set<Integer>> set = ...;
IntSummaryStatistics stats =
set.stream() // Stream<Set<Integer>>
.flatMap(Set::stream) // Stream<Integer>
.mapToInt(Integer::intValue) // IntStream
.summaryStatistics(); // IntSummaryStatistics
int min = stats.getMin();
int max = stats.getMax();
如果沒有記錄任何值,則#getMin()
返回Integer.MAX_VALUE
並且#getMax()
返回Integer.MIN_VALUE
。
Set<Set<Integer>> nestedSets = ...
IntSummaryStatistics stats = nestedSets.stream()
.flatMap(Set::stream)
.mapToInt(Integer::intValue)
.summaryStatistics();
stats.getMax();
stats.getMin();
返回的類型應該是OptionalInt
因為您不知道找到最小值。 你可以做:
OptionalInt min = nestedSets.stream()
.flatMap(Set::stream)
.mapToInt(Integer::intValue)
.min();
或者,您可以在Stream::min
內使用具有相同映射 function ( Integer::intValue
) 的Comparator
,這會導致 boxed Optional<Integer>
Optional<Integer> min = nestedSets.stream()
.flatMap(Set::stream)
.min(Comparator.comparingInt(Integer::intValue));
這取決於您是需要所有這些值還是只需要min
或max
。
優點:我發現這些解決方案易於閱讀,沒有冗余代碼,是計算 min/max/avg 或更多的最佳方法。
缺點:您只能同時計算一個值( min
或max
)。 使用IntSummaryStatistics
進行匯總計算,否則已在此處回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.