簡體   English   中英

如何使用流在沒有冗余代碼的情況下獲取嵌套 collections 的最小/最大元素?

[英]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));

這取決於您是需要所有這些值還是只需要minmax

  • 優點:我發現這些解決方案易於閱讀,沒有冗余代碼,是計算 min/max/avg 或更多的最佳方法。

  • 缺點:您只能同時計算一個值( minmax )。 使用IntSummaryStatistics進行匯總計算,否則已在此處回答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM