最近突然对Stream比较感兴趣,因此想简单了解一下,发现要使用stream就必须要熟悉Collectors的各个方法。因此就抽出一点时间把Collectors的所有方法全部看一遍,下面是对各个方法的个人理解,因为没时间也没有兴趣去仔细分析每个方法的源码,因此只是根据官方文档和自己的示例去理解每个方法的功能和作用以及其用法。其中如果有理解不正确的地方还请大家指出一起讨论。
1、averagingInt
Collectors.averagingDouble
# averagingDouble方法返回一个Collector收集器,它生成应用于输入元素的double值函数的算术平均值。如果没有元素,则结果为0。
简单地说就是求元素平均值,如果没有元素就设定平均值为0;
Collectors.averagingInt
Collectors.averagingLong
这两个方法和上面方法类似,都是返回一个collector,这个collector用于生成输入元素计算的平均值。
下面就以最常用的Collectors.averagingInt函数为例来说明其用法:
语法如下-
static <T> Collector<T,?,Double> averagingInt(ToIntFunction<? super T> mapper)
示例:
void test17() {
List<Integer> list = List.of(1,2,3,4,100);
int avg = list.stream().collect(Collectors.averagingInt(a -> a)).intValue();
System.out.println(avg);
}
输出:22
以上三个方法返回的collector定义都是: static <T> Collector<T,?,Double> ,再看collect方法定义
<R, A> R collect(Collector<? super T, A, R> collector);
因此可以看出得出平均值数据类型都是double类型,因此最后如果要得直接到int类型就一定要类型转换一下。
针对其他数据类型的list的使用简单示例:
void test17() {
//List<Integer> list = List.of(1,2,3,4,100);
List<String> list = List.of("1","2","3","4","100");
int avg = list.stream().collect(Collectors.averagingInt(Integer::parseInt)).intValue();
System.out.println(avg);