如何使用Java 8查找以下列表中数字的最大值、最小值、总和和平均值?
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
有一个类名为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
东西。 - Krzysztof Jabłoński.mapToInt((x) -> x)
这样的代码时,可以从中了解很多关于Java编程语言的信息。 - njzk2map(myIntSummaryStatistics::accept)
,因为将其转换为 intstream 感觉非常奇怪) - njzk2我认为了解一个问题的多种解决方案总是很好的,这样可以选择最适合问题的解决方案。以下是一些其他的解决方案:
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
//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));