彼らは同じフィールドを持っている場合は、オブジェクトをフィルタリングし、組み合わせる方法

ヴラドKhurtin:

私は問題を解決しようとしたと立ち往生しています。私はクラスのユーザーを持っています:

public class User {

   public String name;
   public String email;
   public Integer age;
   public String group;

   public User() {
   }

   public User(String name, String email, Integer age, String group) {
      this.name = name;
      this.email = email;
      this.age = age;
      this.group = group;
   }
}

そして、ユーザのリストは、次のようになります。

List<User> users = new ArrayList<>();
users.add(new User("Max" , "test@test", 20 , "n1"));
users.add(new User("John" , "list@test", 21 , "n2"));
users.add(new User("Nancy" , "must@test", 22 , "n3"));
users.add(new User("Nancy" , "must@test", 22 , "n4"));
users.add(new User("Max" , "test@test", 20 , "n5"));

しかし、このリストは、グループ内の違いで重複したオブジェクトが含まれています。だから私は、新しいオブジェクトに見えるように重複したオブジェクトを結合する必要があります。

ユーザー:名: "マックス"、電子メール: "テスト@テスト"、年齢:20、グループ: "N1、N5"

ユーザー:名: "ジョン"、電子メール: "テスト@リスト"、年齢:21、グループ: "N2"

ユーザー:名: "ナンシー"、電子メール: "必見@テスト"、年齢:22、グループ: "N3、N4"

私は、私は、Java 8から湯気を使用する必要があるが、どのように正確に理解していないことを理解しています。

助けてください

ニコラスK:

あなたは、単に行うことができます。

List<User> sortedUsers = new ArrayList<>();
// group by email-id
Map<String, List<User>> collectMap = 
                 users.stream().collect(Collectors.groupingBy(User::getEmail));

collectMap.entrySet().forEach(e -> {
    String group = e.getValue().stream()                     // collect group names
                               .map(i -> i.getGroup())
                               .collect(Collectors.joining(","));
    User user = e.getValue().get(0);
    sortedUsers.add(new User(user.getName(), user.getEmail(), user.getAge(), group));
});

これは出力:

[
   User [name=John, email=list@test, age=21, group=n2], 
   User [name=Max, email=test@test, age=20, group=n1,n5], 
   User [name=Nancy, email=must@test, age=22, group=n3,n4]
]

ゲッターとセッターを追加することを確認し、また、オーバーライドするtoString()ユーザのを。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=233418&siteId=1