zoukankan      html  css  js  c++  java
  • java8根据对象属性过滤掉相同元素

    有这样一种情况:某人工资一天涨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<User> 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<User> removeDuplicateUser(List<User> users){
            Set<User> set = new TreeSet<User>(new Comparator<User>() {
                @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<User> list){
            for (User user : list) {
                System.out.println(user.getUsername() + ", " + user.getMoney());
            }
            System.out.println("-------------------------------");
    
        }
    

    5、测试:

    public static void main(String[] args) {
            List<User> 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<User> users2 = removeDuplicateUser(users);
            printList(users2);
    
        }
    

    6、运行结果:

    可以看到,用传统遍历方式可以实现功能,而java8新特性增加了lambda表达式和stream流,提供了操作集合的方便操作,下面通过java8新特性简单实现相同功能:

    1、过滤方法:

    public static List<User> removeDuplicateUser(List<User> users){
            Set<User> set = new TreeSet<User>((user1, user2) -> user1.getUsername().compareTo(user2.getUsername()));
    
            set.addAll(users);
            return new ArrayList<>(set);
        }
    

    2、打印方法:

    public static void printList(List<User> list){
            list.stream().forEach(user -> System.out.println(user.getUsername() + ", " + user.getMoney()));
            System.out.println("-------------------------------");
        }
    

    3、测试运行:

    效果相同!

  • 相关阅读:
    Asp.net Treeview 客户端选中效果实现 (初级)
    MYSQL生成日历表,通常在做报表的时候需要用来生成一个临时表,用来左连接等。
    写了一个抽奖类,感觉还不错,可以适合各种变化
    将系统的内部类:HttpValueCollection 移到自己的系统中,使其能方便的解析id=1&name=张三&sex=男这样的字符串参数 querystring
    指定某个文件的创建 修改 访问时间
    Reqeust["keyname"] 的读取顺序
    pku1463 Strategic game
    pku1947 Rebuilding Roads
    pku1848 Tree
    pku1056 IMMEDIATE DECODABILITY
  • 原文地址:https://www.cnblogs.com/wang-zai/p/8261913.html
Copyright © 2011-2022 走看看