Stream学习-性能差距(二)
一、性能差距
1、很是好奇新的方法跟之前的循环遍历之间的性能差距有多少,简单测试了下,代码如下:
package com.example.demo;
import com.example.demo.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
@SpringBootTest
public class DemoApplicationTests {
@Test
public void testStreamEfficiency(){
List<User> list = new ArrayList<>();
User user = null;
for (int i = 0; i < 10000; i++) {
user = new User();
user.setId(i);
user.setName("zhangsan" + i);
user.setAge(18 + i);
list.add(user);
}
//1、筛选年龄为偶数的用户
Long l1 = System.currentTimeMillis();
//1.1使用传统遍历筛选
List<User> resultList = new ArrayList();
for (User u : list){
if (u.getAge() % 2 == 0){
resultList.add(u);
}
}
System.out.println("1/原始方式结束时间差 ----------- " + (System.currentTimeMillis() - l1));
//1.2使用stream筛选
Long l2 = System.currentTimeMillis();
List<User> resultList2 = new ArrayList();
resultList2 = list.stream().filter( u -> u.getAge() % 2 == 0).collect(Collectors.toList());
System.out.println("1/stream筛选开结束时间差 ----------- " + (System.currentTimeMillis() - l2));
//2、双重遍历筛选
//2.1原始方式双重循环筛选用户
Long l3 = System.currentTimeMillis();
List<User> list1 = new ArrayList<>();
for (int i = 0; i < 10000 ; i+=2) {
int i1 = i;
for (User u : list){
if (u.getAge() == i1){
list1.add(u);
}
}
}
System.out.println("2/原始方式筛选用户时间差 ----------- " + (System.currentTimeMillis() - l3));
//2.2使用stream筛选用户
Long l4 = System.currentTimeMillis();
List<User> list2 = new ArrayList<>();
for (int i = 0; i < 10000; i+=2) {
int i2 = i;
list2.addAll(list.stream().filter(u -> (u.getAge()== i2)).collect(Collectors.toList()));
}
System.out.println("2/stream筛选用户时间差 ----------- " + (System.currentTimeMillis() - l4));
//2.3原始方式双重循环筛选获取属性字段
Long l5 = System.currentTimeMillis();
List<String> list3 = new ArrayList<>();
for (int i = 0; i < 10000 ; i+=2) {
int i1 = i;
for (User u : list){
if (u.getAge() == i1){
list3.add(u.getName());
}
}
}
System.out.println("2/原始方式筛选字段时间差 ----------- " + (System.currentTimeMillis() - l5));
//2.4使用stream筛选属性字段
Long l6 = System.currentTimeMillis();
List<String> list4 = new ArrayList<>();
for (int i = 0; i < 10000; i+=2) {
int i2 = i;
list4.addAll(list.stream().filter(u -> (u.getAge()== i2)).map(User::getName).collect(Collectors.toList()));
}
System.out.println("2/stream筛选字段时间差 ----------- " + (System.currentTimeMillis() - l6));
}
}
2、结果如下图,多次测量结果差不太多,基本如下: