小事的背景
在日常业务开发的过程中,大家肯定有把一个List转成另外一个List的场景,Java8出了很久,流这个新的特性大家玩的也特别好了,所以这种场景,大家写的越来越🌹🍐🐯🔥~
知道有一天,一个十年资深Java高级开发工程师甩给我一个分支,让我学习,我看到了下面这段代码~
代码
为了狗命,所以代码打了厚🐎,大佬们凑活看,心中无🐎,自然万物无🐎
然后我就开始分析了。
image.png
image.png
image.png
image.png
经过一顿分析后,分析失败,不过大佬这么写一定有大佬的道理,但是咱也不敢问,本着热爱学习的态度,我觉得做个实验。
image.png
讲理咱嘴笨,就喜欢敲代码
image.png菜狗一顿操作,做个实验吧
public class Solution {
private static List<String> strings;
static {
strings = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
strings.add(i + "");
}
}
private static List<Integer> resultStrings = new ArrayList<>();
/**
* 不用啥新特性,老老实实用循环 朴实无华
*/
private static void function1() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
for (String s : strings) {
resultStrings.add(Integer.valueOf(s));
}
stopWatch.stop();
log.info("朴实无华 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
}
/**
* 资深开发工程师 写法
*/
private static void function2() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
strings.stream().forEach(a -> {
Integer i = Integer.valueOf(a);
resultStrings.add(i);
});
stopWatch.stop();
log.info("资深开发 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
}
/**
* 常规流的应用
*/
private static void function3() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
resultStrings = strings.stream().map(Integer::new).collect(Collectors.toList());
stopWatch.stop();
log.info("常规写法 result size = {}, cost time = {}", resultStrings.size(), stopWatch.getNanoTime());
}
/**
* 开始实验吧
*
* @param args
*/
public static void main(String[] args) {
log.info("现在是北京时间 = {}", LocalDateTime.now());
function1();
function2();
function3();
}
}
整理一下实验结果
实验序号 | 结果 |
---|---|
1 | |
2 | |
3 | |
4 | |
5 |
感觉分析不出来~~ 然后把List扩大到一百万,然后循环20次这个实验,结论
一顿操作之后,我发现,这三种写法在时间上其实都有快有慢,真的说不好~~
结尾
从效率上很难说谁快谁慢,各有优劣,而且循环百万List的场景也不是很常见,日常开发循环的哪些数组也难从这种细节写法上优化多少多少。
但就从写法上来说,个人觉得不太好看,都已经用了流了,还是想生成另外一个数组的这种场景,为什么不用map?是因为不香么?
网友评论