Java中如何将List<Long>转换为List<Number>?最优方案及数据疑问
List 转 List 的实现与疑问解答
转换实现:更简洁高效的方式
你目前的代码里map(Long::new)是完全多余的操作——因为Long本身就是Number的子类,直接利用泛型的向上转型特性就能完成转换,不需要额外的装箱/拆箱操作。
这里有两种更优的实现方式:
方式一:直接通过集合构造函数(最简最优)
List<Number> numberList = new ArrayList<>(longList);
ArrayList的构造函数支持接收Collection<? extends E>类型的参数,这里Long是Number的子类,完全符合要求,这种方式不需要流操作,性能更优,代码也更简洁。
方式二:通过Stream转换(适合需要额外处理的场景)
如果后续需要对元素做其他操作,用Stream的话也可以简化成:
List<Number> numberList = longList.stream() .map(Number.class::cast) .collect(Collectors.toList());
这里的map(Number.class::cast)只是把Long引用强制转为Number类型,没有任何对象创建或数值转换的开销。
关于你的代码:为什么不是最优?
你写的map(Long::new)会把每个Long对象先拆箱为long基本类型,再重新装箱成新的Long对象,完全是无意义的性能浪费,而且没有任何实际作用——因为原元素已经是Long,本身就符合Number类型的要求。
数据丢失问题:完全不存在
这种转换只是引用类型的向上转型,本质上集合里存储的还是原来的Long对象,数值没有任何改变,自然不会有数据丢失的情况。当你需要从numberList中取出元素时,只要再向下转型回Long就能拿到完整的原始数值。
内容的提问来源于stack exchange,提问作者puzzledchamp
相关产品推荐
相关产品推荐

