【问题标题】:Find maximum, minimum, sum and average of a list in Java 8在 Java 8 中查找列表的最大值、最小值、总和和平均值
【发布时间】:2014-09-23 06:52:35
【问题描述】:

如何在Java 8中求下列列表中数字的最大值、最小值、总和和平均值?

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

【问题讨论】:

  • 您可以通过编写应用程序来实现。到目前为止,您尝试过什么?
  • 以下列表是什么?您打算发布一些代码吗?
  • OP 是否获得了此问题的徽章?我第一次看到一个带有 -8 的问题的答案是 +29
  • @Adam OP 得到了与选票无关的this badge。您评论的星座不会让提问者获得徽章,但回答者得到了this badge,并且由于您发表评论后问题的分数变为正数,因此回答者也得到了this badge .

标签: java lambda java-8 java-stream


【解决方案1】:

有一个类名,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}

希望对你有帮助

Read about IntSummaryStatistics

【讨论】:

  • 不是一个明显的,但一个很好的答案。我喜欢IntSummaryStatistics 的东西。
  • 当你看到像.mapToInt((x) -&gt; x)这样的行时,我发现它告诉了很多关于java的信息
  • 对于任何使用任何形式的现代语言的人来说,这似乎是一个肮脏的 hack,或者充其量是一段无用的代码,可以让编译器满意。 (在这种情况下,我可能更愿意使用 map(myIntSummaryStatistics::accept),因为转换为 intstream 感觉很奇怪)
  • @njzk2 我喜欢在这种情况下使用 Integer::valueOf ;)
  • @Naman 谢谢你的慷慨???
【解决方案2】:

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

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));
    

    【讨论】:

    • 您需要解释为什么您的解决方案可以解决问题。您回答的主要内容是想法。代码只是一个说明。
    猜你喜欢
    • 2015-01-16
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2017-07-24
    • 2020-06-17
    相关资源
    最近更新 更多