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+使其更公平