Collectors.averagingInt

本文介绍了Java8中Stream API的Collectors.averagingInt()方法,该方法用于计算整数流的平均值。通过示例代码展示了将Double流转换为整数并计算平均值的过程,揭示了在转换过程中可能出现的小数点截断现象。在理解这个方法的同时,也提醒开发者注意数据类型转换可能带来的精度损失。
摘要由CSDN通过智能技术生成

Collectors.averagingInt

Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作。

Collectors.averagingInt() 方法和 Collectors.averagingDouble() 一样,不同的是它把流中的所有元素看成是 int类型,并返回一个浮点类型的平均值

然而:最不同的是–> 方法体中执行次数不同,做了优化

@Test
public void AveragingIntExample() {
    List<Double> list = Arrays.asList(1.1, 2.2, 3.3, 4.4, 5.5);
    Double result = list.stream().map(s -> {
        System.out.println("map-> " + s);
        return s;
    }).collect(Collectors.averagingInt(d -> {
                System.out.println(d + "-->" + (int) (d * 2));
                return (int) (d * 2);
            })
    );
    System.out.println("结果: "+result);
}

执行结果

map-> 1.1
1.1-->2
map-> 2.2
2.2-->4
map-> 3.3
3.3-->6
map-> 4.4
4.4-->8    #??? 这里为什么是 8? 4.4*2 = 8.8? 转化为Int之后变为8
map-> 5.5
5.5-->11
结果: 6.2

收货: Double值强转Int后,会丢失小数点后的值,不信你可以试一试

System.out.println((int) (9.9)); //值为9
Collectors.toMap和Collectors.mapping都是Java 8中的流操作工具类Collectors的方法,用于对流中的元素进行收集和转换。 Collectors.toMap方法用于将流中的元素映射为键值对,并将其收集到一个Map中。它接受两个参数,第一个参数是用于提取键的函数,第二个参数是用于提取值的函数。如果流中存在重复的键,则会抛出一个IllegalStateException异常。 而Collectors.mapping方法则是在收集元素到Map时,对元素进行进一步的转换操作。它接受两个参数,第一个参数是用于提取键的函数,第二个参数是用于对值进行转换的函数。它可以与其他收集器一起使用,例如Collectors.toList或Collectors.toSet,来对值进行进一步的收集和转换。 下面是一个示例代码,演示了如何使用Collectors.toMap和Collectors.mapping方法: ```java import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Example { public static void main(String[] args) { List<String> fruits = Arrays.asList("apple", "banana", "orange"); // 使用Collectors.toMap将水果列表转换为以长度为键,水果名称为值的Map Map<Integer, String> lengthToNameMap = fruits.stream() .collect(Collectors.toMap(String::length, fruit -> fruit)); System.out.println(lengthToNameMap); // 使用Collectors.mapping将水果列表转换为以长度为键,水果名称列表为值的Map Map<Integer, List<String>> lengthToNamesMap = fruits.stream() .collect(Collectors.groupingBy(String::length, Collectors.mapping(fruit -> fruit, Collectors.toList()))); System.out.println(lengthToNamesMap); } } ``` 输出结果为: ``` {5=apple, 6=orange, 6=banana} {5=[apple], 6=[orange, banana]} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值