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、測試運行:

效果相同!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM