如何使用流在没有冗余代码的情况下获取嵌套集合的min / max元素?

问题描述 投票:0回答:3

例如:

给出Set<Set<Integer>>,我尝试使用

int min = nestedSets.stream().map(s->s.stream().min(Comparator.naturalOrder()).get()).min(Comparator.naturalOrder()).get();

我最初的想法是使用flatMap,但是它没有返回期望的结果。

java java-8 stream
3个回答
1
投票
    Set<Set<Integer>> nestedSets = ...

    IntSummaryStatistics stats = nestedSets.stream()
                                           .flatMap(Set::stream)
                                           .mapToInt(Integer::intValue)
                                           .summaryStatistics();

    stats.getMax();
    stats.getMin();

1
投票

您可以将元素收集到IntSummaryStatistics中,这是:

用于收集统计信息(例如计数,最小值,最大值,总和和平均值的状态对象。

例如:

IntSummaryStatistics

如果未记录任何值,则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()


0
投票

返回的类型应该是Integer.MIN_VALUE,因为您不知道找到的最小值。您可以这样做:

OptionalInt

或者,您可以将OptionalInt min = nestedSets.stream() .flatMap(Set::stream) .mapToInt(Integer::intValue) .min(); Comparator内的映射功能(Integer::intValue)使用完全相同的映射功能,而将其装在方框中Stream::min

Optional<Integer>

我发现这些解决方案易于阅读,没有多余的代码。

© www.soinside.com 2019 - 2024. All rights reserved.