【问题标题】:get list of unique objects from an arraylist in java从java中的arraylist获取唯一对象列表
【发布时间】:2018-06-28 14:24:16
【问题描述】:

我有一份员工名单如下:

[Employee{id="1", NID="A123", wages=5000},
 Employee{id="2", NID="B123", wages=1000},
 Employee{id="3", NID="C123", wages=2000},
 Employee{id="4", NID="C123", wages=3000}]

我需要能够仅检索唯一的对象,并且 NID 相同,我需要检索具有最大 Id 的对象。所以最终的列表应该是这样的

[Employee{id="1", NID="A123", wages=5000},
 Employee{id="2", NID="B123", wages=1000},
 Employee{id="4", NID="C123", wages=3000}]

我知道可以使用嵌套的 for 循环来做到这一点,但我想用 Java 流来做到这一点。我可以使用 group by 找到列表中重复的员工,但我仍然不知道如何获取上面的列表。

 Map<String, List<Employee>> groupByNid = employeeList.stream().collect(Collectors.groupingBy(Employee::getNID));

感谢帮助。

阿什利

【问题讨论】:

    标签: java java-stream


    【解决方案1】:

    我提出以下建议:

        Collection<Employee> filteredEmployees = employeeList.stream()
                .collect(Collectors.toMap(
                        Employee::getNID, Function.identity(),
                        BinaryOperator.maxBy(Comparator.comparing(Employee::getID))
                )).values();
    

    【讨论】:

    • 注意:事实证明它与 Ernest Kiwele 的答案几乎相同,只是它使用BinaryOperator.maxBy 并根据 OP 的要求比较 ID 而不是 NID。
    【解决方案2】:

    您可以收集到映射,使用NID字段作为键,然后在合并功能中选择最高的ID字段:

    List<Employee> employeeList = ...;
    Collection<Employee> uniqueEmployees = employeeList.stream()
            .collect(Collectors.toMap(Employee::getNID, 
                    Function.identity(), 
                    (e1,e2) -> e1.getID().compareTo(e2.getID()) > 0 ? e1: e2)
            ).values();
    

    【讨论】:

      【解决方案3】:

      试试这个:

          List<Employee> list = new ArrayList<>();
      
          list.add(new Employee(1,"A123",5000));
          list.add(new Employee(2,"B123",1000));
          list.add(new Employee(3,"C123",2000));
          list.add(new Employee(4,"C123",2000));
      
      
          Set<String> empSet = new HashSet<>();
          list.removeIf(p -> !empSet.add(p.getNid()));
          list.forEach(emp->System.out.println(emp.getId() +" : "+emp.getNid()+" :"+emp.getWage()));
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        employeeList.stream().collect(Collectors.toMap(
                Employee::getNID, r -> r, (e1, e2) ->  e1.getId().compareTo(e2.getId()) > 0 ? e1 : e2));
        

        【讨论】:

          【解决方案5】:
          @Test
          public void t() {
              Employee e1 = new Employee(1, "A123", 400);
              Employee e2 = new Employee(2, "A123", 400);
          
              List<Employee> list = Arrays.asList(e1,e2);
          
              list = list.stream().filter(distinctByNid(Employee::getNid)).collect(Collectors.toList());
              System.out.println(list);
          }
          
          // use a thread safe set to dedup
          public static <T> Predicate<T> distinctByNid(Function<? super T, ?> keyExtractor) {
              Set<Object> seen = ConcurrentHashMap.newKeySet();
              return t -> seen.add(keyExtractor.apply(t));
          }
          
          static class Employee {
              private int id;
              private String nid;
              private int wages;
          
              public Employee(int id, String nid, int wages) {
                  this.id = id;
                  this.nid = nid;
                  this.wages = wages;
              }
          
              public int getId() {
                  return id;
              }
          
              public void setId(int id) {
                  this.id = id;
              }
          
              public String getNid() {
                  return nid;
              }
          
              public void setNid(String nid) {
                  this.nid = nid;
              }
          
              public int getWages() {
                  return wages;
              }
          
              public void setWages(int wages) {
                  this.wages = wages;
              }
          
              @Override
              public String toString() {
                  return "Employee{" +
                          "id=" + id +
                          ", nid='" + nid + '\'' +
                          ", wages=" + wages +
                          '}';
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-11-05
            • 1970-01-01
            • 2011-11-27
            • 1970-01-01
            • 2021-12-06
            • 2022-06-22
            • 1970-01-01
            • 1970-01-01
            • 2014-11-20
            相关资源
            最近更新 更多