Java 8 引入的 Stream API 提供了强大的数据处理功能,其中的 average() 方法用于计算流中元素的平均值。本文将详细介绍 average() 方法的用法、示例代码以及其背后的实现原理。
示例代码
示例1:计算整数流的平均值
package com.fm.design.demo.java.stream.average;
import java.util.stream.IntStream;
/**
* @author 未来码匠
*/
public class AverageDemo {
public static void main(String[] args) {
IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
double averageInt = intStream.average().orElse(0.0);
System.out.println("整数流的平均值:" + averageInt);
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.stream.IntStream;
/**
* @author 未来码匠
*/
public class AverageDemo2 {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};
double average = IntStream.of(numbers)
.average()
.orElse(0.0); // 如果Stream为空,则返回0.0
System.out.println("整数流的平均值:" + average);
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.stream.Stream;
/**
* @author 未来码匠
*/
public class AverageDemo6 {
public static void main(String[] args) {
// 创建一个包含整数的流
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
// 计算平均值
double average = numbers
.mapToInt(Integer::intValue) // 将流转换为 IntStream
.average() // 计算平均值
.orElse(0.0); // 如果流为空,返回默认值
System.out.println("整数流的平均值:" + average);
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.ArrayList;
import java.util.List;
import java.util.OptionalDouble;
import java.util.stream.Stream;
/**
* @author 未来码匠
*/
public class AverageDemo7 {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);
// 使用stream().average()计算平均值
OptionalDouble average = numbers.stream()
.mapToDouble(Integer::doubleValue)
.average();
// 打印平均值(如果存在)
if (average.isPresent()) {
System.out.println("整流的平均值:" + average.getAsDouble());
} else {
System.out.println("没有元素,无法计算平均值。");
}
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.OptionalDouble;
/**
* @author 未来码匠
*/
public class AverageDemo8 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
OptionalDouble average = numbers.stream()
.mapToDouble(Integer::doubleValue)
.average();
if (average.isPresent()) {
System.out.println("整数流的平均值:" + average.getAsDouble());
} else {
System.out.println("流为空,无法计算平均值。");
}
}
}
示例2:计算浮点数流的平均值
package com.fm.design.demo.java.stream.average;
import java.util.stream.DoubleStream;
import java.util.stream.IntStream;
/**
* @author 未来码匠
*/
public class AverageDemo1 {
public static void main(String[] args) {
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0, 3.0, 4.0, 5.0);
double averageDouble = doubleStream.average().orElse(0.0);
System.out.println("浮点数流的平均值:" + averageDouble);
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.Arrays;
import java.util.stream.DoubleStream;
/**
* @author 未来码匠
*/
public class AverageDemo3 {
public static void main(String[] args) {
double[] numbers = { 1.0, 2.0, 3.0, 4.0, 5.0 };
// 创建一个DoubleStream
DoubleStream doubleStream = Arrays.stream(numbers);
// 计算平均值
double average = doubleStream.average().orElse(0.0);
System.out.println("浮点数流的平均值: " + average);
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.OptionalDouble;
import java.util.stream.DoubleStream;
/**
* @author 未来码匠
*/
public class AverageDemo4 {
public static void main(String[] args) {
// 创建一个Double类型的流
DoubleStream doubleStream = DoubleStream.of(1.0, 2.0, 3.0, 4.0, 5.0);
// 使用stream().average()方法计算平均值
OptionalDouble average = doubleStream.average();
// 打印平均值,如果存在的话
if (average.isPresent()) {
System.out.println("浮点数流的平均值: " + average.getAsDouble());
} else {
System.out.println("流为空,无法计算平均值。");
}
}
}
或
package com.fm.design.demo.java.stream.average;
import java.util.List;
/**
* @author 未来码匠
*/
public class AverageDemo5 {
public static void main(String[] args) {
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
// 使用Stream的average()方法计算平均值
double average = numbers.stream()
.mapToDouble(Integer::doubleValue)
.average()
.orElse(0.0);
System.out.println("浮点数流的平均值: " + average);
}
}
示例3: 计算自定义对象流的平均值
package com.fm.design.demo.java.stream.average;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.stream.Stream;
/**
* @author 未来码匠
*/
public class AverageDemo9 {
public static void main(String[] args) {
Stream<Student> studentStream = Stream.of(
new Student("Alice", 90),
new Student("Bob", 85),
new Student("Charlie", 95)
);
double averageScore = studentStream.mapToDouble(Student::getScore).average().orElse(0.0);
System.out.println("学生分数流的平均值:" + averageScore);
}
@Data
@AllArgsConstructor
static class Student {
private String name;
private int score;
}
}
详解
average() 方法用于计算 Stream 中元素的平均值。它返回一个 OptionalDouble 对象,该对象包含了平均值(如果流中有元素的话)。如果流为空,那么返回的 OptionalDouble 将为空,因此可以使用 orElse() 方法提供一个默认值。
在示例代码中,我们首先创建了两种类型的流:一个整数流和一个浮点数流。然后,分别使用 average() 方法计算它们的平均值,并通过 orElse() 方法提供了默认值,以处理可能的空流情况。
使用 mapToInt()
方法将流转换为一个 IntStream。
使用mapToDouble()
方法将Stream中的整数转换为双精度数(double)。
我们使用OptionalDouble
的isPresent()
方法来检查平均值是否存在。如果存在,我们通过getAsDouble()
方法获取平均值并打印出来。否则,我们输出一条消息表示流为空,无法计算平均值。
总结
average()方法是Java Stream API中的一个有用工具,用于计算数字流的平均值。通过使用这个方法,你可以轻松地对集合中的数字进行统计分析,而不必手动编写循环来计算平均值。它提供了更简洁和可读性更高的代码,有助于提高代码的可维护性。在处理数值型数据时,average()方法是一个强大的工具,可以大大简化你的代码。
这篇文章介绍了average()方法的基本用法,并提供了示例代码和详细解释,帮助读者更好地理解和应用这个方法。希望本文能够帮助你更好地利用Java Stream中的average()方法进行数字流的平均值计算。