在Java 8中查找列表的最大值、最小值、总和和平均值

28
如何使用Java 8查找以下列表中数字的最大值、最小值、总和和平均值?
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);

5
你可以通过编写一份申请来实现它。你到目前为止尝试了什么? - BackSlash
任何列表都无关紧要。 - DrJava
@DrJava 那么一个字符串列表是否适合?我怀疑不是。 - Duncan Jones
2
这个问题的 OP 得到了徽章吗?我第一次看到一个问题得分为 -8,但回答得分为 +29。 - Adam
1
@Adam,OP获得了此徽章,该徽章与投票无关。你所评论的问题并不足以使提问者获得徽章,但是回答者获得了此徽章,由于问题的分数在你评论后变为正数,回答者也获得了此徽章 - Holger
显示剩余2条评论
3个回答

128

有一个类名为IntSummaryStatistics

例如:

List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics stats = primes.stream()
                                     .mapToInt((x) -> x)
                                     .summaryStatistics();
System.out.println(stats);

输出:

IntSummaryStatistics{count=10, sum=129, min=2, average=12.900000, max=29}

阅读IntSummaryStatistics的相关信息


1
不是一个显而易见的答案,但非常好。我喜欢那个 IntSummaryStatistics 东西。 - Krzysztof Jabłoński
6
当你看到类似 .mapToInt((x) -> x) 这样的代码时,可以从中了解很多关于Java编程语言的信息。 - njzk2
2
对于任何使用现代语言的人来说,这似乎是一种肮脏的黑客行为,或者最多只是一段无用的代码,只是为了让编译器满意。(在这种情况下,我可能更愿意使用 map(myIntSummaryStatistics::accept),因为将其转换为 intstream 感觉非常奇怪) - njzk2
@njzk2 我喜欢在这种情况下使用Integer :: valueOf() ;) - Line

13

我认为了解一个问题的多种解决方案总是很好的,这样可以选择最适合问题的解决方案。以下是一些其他的解决方案:

final List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);

找到最大值

// MAX -- Solution 1
primes.stream() //
    .max(Comparator.comparing(i -> i)) //
    .ifPresent(max -> System.out.println("Maximum found is " + max));

// MAX -- Solution 2
primes.stream() //
    .max((i1, i2) -> Integer.compare(i1, i2)) //
    .ifPresent(max -> System.out.println("Maximum found is " + max));

// MAX -- Solution 3
int max = Integer.MIN_VALUE;
for (int i : primes) {
    max = (i > max) ? i : max;
}
if (max == Integer.MIN_VALUE) {
    System.out.println("No result found");
} else {
    System.out.println("Maximum found is " + max);
}

// MAX -- Solution 4 
max = Collections.max(primes);
System.out.println("Maximum found is " + max);

找到最小值

// MIN -- Solution 1
primes.stream() //
    .min(Comparator.comparing(i -> i)) //
    .ifPresent(min -> System.out.println("Minimum found is " + min));

// MIN -- Solution 2
primes.stream() //
    .max(Comparator.comparing(i -> -i)) //
    .ifPresent(min -> System.out.println("Minimum found is " + min));

// MIN -- Solution 3
int min = Integer.MAX_VALUE;
for (int i : primes) {
    min = (i < min) ? i : min;
}
if (min == Integer.MAX_VALUE) {
    System.out.println("No result found");
} else {
    System.out.println("Minimum found is " + min);
}

// MIN -- Solution 4
min = Collections.min(primes);
System.out.println("Minimum found is " + min);

求平均值

// AVERAGE -- Solution 1
primes.stream() //
    .mapToInt(i -> i) //
    .average() //
    .ifPresent(avg -> System.out.println("Average found is " + avg));

// AVERAGE -- Solution 2
int sum = 0;
for (int i : primes) {
    sum+=i;
}
if(primes.isEmpty()){
    System.out.println("List is empty");
} else {
    System.out.println("Average found is " + sum/(float)primes.size());         
}

求和

// SUM -- Solution 1
int sum1 = primes.stream() //
    .mapToInt(i -> i) //
    .sum(); //
System.out.println("Sum found is " + sum1);

// SUM -- Solution 2
int sum2 = 0;
for (int i : primes) {
    sum2+=i;
}
System.out.println("Sum found is " + sum2);

但请尽可能简洁,以下是我最喜欢的内容:

// Find a maximum with java.Collections
Collections.max(primes);

// Find a minimum with java.Collections 
Collections.min(primes);

顺便说一下,Oracle教程是一个黄金矿山:https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html


3
    //By using lambda
    int sum = primes.stream().mapToInt(a->a).sum();
    System.out.println(sum);
    int min = primes.stream().mapToInt(a->a).min().orElse(0);
    System.out.println(min);
    int max = primes.stream().mapToInt(a->a).max().orElse(0);
    System.out.println(max);
    double average = primes.stream().mapToInt(a->a).average().orElse(0);
    System.out.println(average);
    
    //By using Collections
    System.out.println(Collections.min(primes));
    System.out.println(Collections.max(primes));

3
你需要解释为什么你的解决方案可以解决这个问题。你回答的主要内容是你的想法,代码只是一个示例。 - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接