老徐要招人,一定要搞个笔试题,想搞一个接地气的,就出了一个出折线图的题,题目要求如下:
这货一早上先来考我能否读懂(我好像给他泄题了~~~)
这咱情况系统比较常见的就是出折线图~来吧,小练一下(lambda表达式用顺手了真的能减少很多代码量,以下是通过lambda实现的,自己写着玩,大家看着玩,感兴趣的可以找些l相问知识学习下),废话了半天,看代码吧(绝对是贴过去就能用的那种代码)
import org.assertj.core.util.Lists;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
public class User {
public User() {
}
public User(String name, Date date, double money) {
this.name = name;
this.birthday = date;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
private String name;
private Date birthday;
private double money;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", birthday=" + birthday +
", money=" + money +
'}';
}
public static Date getDate(String time) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
try {
return dateFormat.parse(time);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
class NiMei {
List<Date> list;
List<User> users;
public List<Date> getList() {
return list;
}
public void setList(List<Date> list) {
this.list = list;
}
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
}
public static void main(String[] args) {
//初始化测试数据
List<User> listA = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User u = new User("zhanglu" + i, User.getDate("198" + i + "0509172640"), 230d);
listA.add(u);
}
List<User> listB = new ArrayList<>();
for (int i = 7; i < 10; i++) {
User u = new User("zhanglu" + i, User.getDate("198" + i + "0509172640"), 230d);
listB.add(u);
}
//合并到一个list里
listA.addAll(listB);
//开始处理
List<User> result = Lists.newArrayList();
listA.parallelStream().collect(Collectors.groupingBy(u -> (u.getName() + u.getBirthday()), Collectors.toList())).forEach(
(id, calculator) -> {
calculator.stream().reduce((a, b) -> new User(a.getName(), a.getBirthday(), a.getMoney() + b.getMoney())).ifPresent(result::add);
});
List<Date> birthdays = result.stream().map(User::getBirthday).collect(Collectors.toList());
System.out.println(birthdays.toString());
result.forEach(e -> {
System.out.println(e.toString());
});
//返回你要的结果
NiMei niMei = new User().new NiMei();
niMei.setList(birthdays);
niMei.setUsers(result);
}
}
简单吧~
parallelStream可以理解流式的并行处理,可以并行处理多任务,对一个list操作时,如果引用了parallelStream操作,顺序不一定是存入时的顺序;reduce就是合并计算用;stream:就是把操作对象转成流去操作;双冒号::是lambda表达式的写法,可以用来做静态方法引用(TimeUtils::getTime)、对象的超类方法引用(super::method)、对象的实例方法引用(System.out::println)、类构造器引用(ArrayList::new)等,想了解更多自己查查吧