小事的背景
在日常业务开发的过程中,大家肯定有把一个List转成另外一个List的场景,Java8出了很久,流这个新的特性大家玩的也特别好了,所以这种场景,大家写的越来越🌹🍐🐯🔥~
知道有一天,一个十年资深Java高级开发工程师甩给我一个分支,让我学习,我看到了下面这段代码~
![](https://img.haomeiwen.com/i10113130/d6c5a23ca59a2afb.png)
为了狗命,所以代码打了厚🐎,大佬们凑活看,心中无🐎,自然万物无🐎
然后我就开始分析了。
![](https://img.haomeiwen.com/i10113130/afde5867d1791015.png)
![](https://img.haomeiwen.com/i10113130/0037d5973bbdd1b2.png)
![](https://img.haomeiwen.com/i10113130/475505939e5c4caf.png)
![](https://img.haomeiwen.com/i10113130/b12633e7bcd6c4be.png)
经过一顿分析后,分析失败,不过大佬这么写一定有大佬的道理,但是咱也不敢问,本着热爱学习的态度,我觉得做个实验。
![](https://img.haomeiwen.com/i10113130/5a5795eb8c6690c5.png)
讲理咱嘴笨,就喜欢敲代码
![](https://img.haomeiwen.com/i10113130/356b1d43054eca46.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 |
![]() |
![](https://img.haomeiwen.com/i10113130/60d50951517548d7.png)
感觉分析不出来~~ 然后把List扩大到一百万,然后循环20次这个实验,结论
![](https://img.haomeiwen.com/i10113130/a8b0218373ed6f66.png)
![](https://img.haomeiwen.com/i10113130/3e707dff64ce93eb.png)
![](https://img.haomeiwen.com/i10113130/bdc87920ab21344d.png)
![](https://img.haomeiwen.com/i10113130/46a8370a712834ef.png)
一顿操作之后,我发现,这三种写法在时间上其实都有快有慢,真的说不好~~
结尾
从效率上很难说谁快谁慢,各有优劣,而且循环百万List的场景也不是很常见,日常开发循环的哪些数组也难从这种细节写法上优化多少多少。
但就从写法上来说,个人觉得不太好看,都已经用了流了,还是想生成另外一个数组的这种场景,为什么不用map?是因为不香么?
网友评论