有这样一种情况:某人工资一天涨100块钱,数据库中记录了员工姓名和工资,如:
如果此时只需要根据姓名查找员工的其中一条记录该怎么办呢,我们可以用sql语句distinct或groupby达到效果,如果用java集合怎么做呢,如果用java8新特性lambda表达式怎么做呢?
其实说白了,就是过滤掉相同元素的问题,姓名相同的员工视为同一个人,过滤掉其他记录,拿到此人其中一条记录即可
先给出直观效果:
为实现此功能,我们可以这样做:
1、新建用户类:
class User{
private String username;
private int money;
public User(){}
public User(String username, int money){
this.username = username;
this.money = money;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getMoney() {
return money;
}
public void setMoney(int money) {
this.money = money;
}
}
2、实例化对象,添加到List集合:
List users = Arrays.asList(
new User("张三", 1000),
new User("张三", 1100),
new User("张三", 1200),
new User("李四", 1000),
new User("李四", 1100),
new User("王五", 2500),
new User("赵六", 1800));
3、用传统方式写一个过滤重复元素的方法:
public static List removeDuplicateUser(List users){
Set set = new TreeSet(new Comparator() {
@Override
public int compare(User o1, User o2) {
return o1.getUsername().compareTo(o2.getUsername());
}
});
set.addAll(users);
return new ArrayList<>(set);
}
4、用传统方式写一个打印List集合的方法:
public static void printList(List list){
for (User user : list) {
System.out.println(user.getUsername() + ", " + user.getMoney());
}
System.out.println("-------------------------------");
}
5、测试:
public static void main(String[] args) {
List users = Arrays.asList(
new User("张三", 1000),
new User("张三", 1100),
new User("张三", 1200),
new User("李四", 1000),
new User("李四", 1100),
new User("王五", 2500),
new User("赵六", 1800));
printList(users);
List users2 = removeDuplicateUser(users);
printList(users2);
}
6、运行结果:
可以看到,用传统遍历方式可以实现功能,而java8新特性增加了lambda表达式和stream流,提供了操作集合的方便操作,下面通过java8新特性简单实现相同功能:
1、过滤方法:
public static List removeDuplicateUser(List users){
Set set = new TreeSet((user1, user2) -> user1.getUsername().compareTo(user2.getUsername()));
set.addAll(users);
return new ArrayList<>(set);
}
2、打印方法:
public static void printList(List list){
list.stream().forEach(user -> System.out.println(user.getUsername() + ", " + user.getMoney()));
System.out.println("-------------------------------");
}
3、测试运行:
效果相同!