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

Java 如何在不使用流的冗余代码的情况下获取嵌套集合的min/max元素?,java,java-8,java-stream,Java,Java 8,Java Stream,例如: 给定一个集合,我尝试使用 int min = nestedSets.stream().map(s->s.stream().min(Comparator.naturalOrder()).get()).min(Comparator.naturalOrder()).get(); 我最初的想法是使用flatMap,但是它不会返回所需的结果。您可以将元素收集到一个 用于收集统计信息(如计数、最小值、最大值、总和和平均值)的状态对象 例如: Set=。。。; IntSummaryStatis

例如:

给定一个
集合
,我尝试使用

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

我最初的想法是使用
flatMap
,但是它不会返回所需的结果。

您可以将元素收集到一个

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

例如:

Set=。。。;
IntSummaryStatistics=
set.stream()//流
.flatMap(Set::stream)//流
.mapToInt(Integer::intValue)//IntStream
.summaryStatistics();//综合统计
int min=stats.getMin();
int max=stats.getMax();
如果未记录任何值,则
#getMin()
返回
Integer.MAX\u值
#getMax()
返回
Integer.MIN\u值
设置嵌套集=。。。
    Set<Set<Integer>> nestedSets = ...

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

    stats.getMax();
    stats.getMin();
IntSummaryStatistics=nestedSets.stream() .flatMap(集合::流) .mapToInt(整数::intValue) .summaryStatistics(); stats.getMax(); stats.getMin();
返回的类型应该是
OptionalInt
,因为您不知道它的最小值是多少。你可以做:

OptionalInt min = nestedSets.stream()
    .flatMap(Set::stream)
    .mapToInt(Integer::intValue)
    .min();
或者,您可以在
Stream::min
中使用具有非常相同的映射函数(
Integer::intValue
)的
Comparator
,这将导致装箱
可选

Optional<Integer> min = nestedSets.stream()
    .flatMap(Set::stream)
    .min(Comparator.comparingInt(Integer::intValue));
Optional min=nestedSets.stream()
.flatMap(集合::流)
.min(Comparator.comparingInt(Integer::intValue));
这取决于您是需要所有这些值,还是只需要
min
max

  • 优点:我发现这些解决方案易于阅读,没有冗余代码,是计算最小值/最大值/平均值或更多值的最佳方法

  • 缺点:您只能同时计算一个值(或
    min
    max
    )。使用
    IntSummaryStatistics
    进行汇总计算,否则此处已回答


甚至很有趣,我们将其命名为
stats
same:)1+使其更公平