【问题标题】:How to perform join query using Java stream [duplicate]如何使用 Java 流执行连接查询 [重复]
【发布时间】:2022-02-23 04:15:49
【问题描述】:

我正在从 db 中获取数据并将其存储在列表中。然后基于 id,我想创建新的对象。我已经使用旧的 for 循环方法实现了它。我正在尝试使用 java 流来实现它。有什么帮助吗?谢谢。

        List<Employee> emp = new ArrayList<Employee>();
        emp.add(new Employee(1, "Ben", "Glasgow"));
        emp.add(new Employee(2, "Max", "Seattle"));
        emp.add(new Employee(3, "Sam", "Mumbai"));
        emp.add(new Employee(4, "John", "Aukland"));
        emp.add(new Employee(5, "Rob", "Tokyo"));

        List<Department> dpt = new ArrayList<Department>();
        dpt.add(new Department(1, 40000, "tech"));
        dpt.add(new Department(2,  30000, "mgm"));
        dpt.add(new Department(3,  50000, "tech"));
        dpt.add(new Department(4,  30000, "mgm"));


        List<EmpDep> empDep = new ArrayList<EmpDep>();
        
        /**How to do this using stream
        for (int i = 0; i < emp.size(); i++){
            empDep.add(new EmpDep(emp.get(i).getId(), emp.get(i).getName(), dpt.get(i).getSalary()));
        }
        */

【问题讨论】:

  • 您说您想“基于 id”加入,但您的循环只是组合相同列表索引处的对象,并且会因第二个列表没有足够的元素而失败并出现异常。部门和员工一样多是没有意义的。员工应该有一个属性来确定相应的部门,并且该属性不应该是员工的唯一 id。然后,考虑在数据库中进行连接并获取结果,而不是手动执行数据库的工作。

标签: collections java-8 java-stream


【解决方案1】:

为此,您需要从emp 列表中创建一个stream。然后使用map() 操作将Stream&lt;Employee&gt; 转换为Stream&lt;EmpDep&gt;,方法是根据Employee 对象创建一个EmpDep 对象,这正是您在循环中完成的方式。然后使用collect(Collectors.toList())将所有元素收集到一个列表中。

        List<EmpDep> empDep = emp.stream() // Stream of Employee 
            .map(employee -> new EmpDep(employee.getId(), // Stream of EmpDep
                                        employee.getName(),
                                        employee.**getDeparment()**.getSalary()))
            .collect(Collectors.toList());

注意,在您提供的代码中,您将根据构成您的解决方案的元素的索引绑定这两个列表 易碎。如果Employee 类有一个指向其部门 的属性会更好。或者Department 类有一个员工对象的集合。或两个选项。

您不能像这样通过数据结构连接您的之间的反映关系,这是设计错误。

为了改进类设计,我鼓励您添加 department 属性Employee 类(getter 到属性 getDeparment() 在上面的流中使用)。

【讨论】:

  • employee(Employee class) 没有 getSalary() 方法。 getSalary() 属于部门类
  • @RajB009 好的,我一会儿改一下代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 2018-09-23
  • 2020-10-08
相关资源
最近更新 更多