【问题标题】:Stream within a Stream using two list使用两个列表在 Stream 内流式传输
【发布时间】:2019-10-23 16:41:25
【问题描述】:

我有 2 个员工名单。第一个列表包含姓名和employeeId,第二个List 包含employeeId 和手机号码。员工 id 是主键。 要求是使用流媒体获取包含 id、Name 和 mobile no 的 List。

public class MainApp {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Employee emp1 = new Employee(101, "Shiv1");
        Employee emp2 = new Employee(102, "Shiv2");
        Employee emp3 = new Employee(103, "Shiv3");
        Employee emp4 = new Employee(104, "Shiv4");

        Employee emp5 = new Employee(101, 00001);
        Employee emp6 = new Employee(101, 00002);
        Employee emp7 = new Employee(101, 00003);
        Employee emp8 = new Employee(101, 00004);

        List<Employee> employeeNameList = new ArrayList<Employee>();
        employeeNameList.add(emp1);
        employeeNameList.add(emp2);
        employeeNameList.add(emp3);
        employeeNameList.add(emp4);

        List<Employee> employeeMobileList = new ArrayList<Employee>();
        employeeMobileList.add(emp5);
        employeeMobileList.add(emp6);
        employeeMobileList.add(emp7);
        employeeMobileList.add(emp8);

        employeeNameList.stream()
            .filter(item -> item.getId() == 3)
            .map(i -> i.setMobileNo(9089));
    }
}

【问题讨论】:

  • 您提供的输入的预期结果是什么?
  • 您的问题是什么?有编译器错误吗?例外?输出不正确?请编辑您的问题,以便清楚出了什么问题。
  • 您可以将Map&lt;id, employee&gt; 与一个列表一起使用并遍历另一个列表。
  • 你的意思是像 SQL 中的 FULL OUTER JOIN,其中列表 1 中具有给定 id 的每个对象都与列表 2 中具有相同 id 的每个对象交叉连接,即使其中一个列表没有对象? IE。你希望结果是[[101, "Shiv1", 00001], [101, "Shiv1", 00002], [101, "Shiv1", 00003], [101, "Shiv1", 00004], [102, "Shiv2", null], [103, "Shiv3", null], [104, "Shiv4", null]
  • 输出将是一个包含记录的employeeList:emp1(101,"shiv1",00001),emp2(102,"shiv2",00002) 像这样

标签: java java-8 java-stream


【解决方案1】:
  1. 您可以使用第一个列表创建empId 与其name 的映射。

    Map<Integer, String> empIdToName = employeeNameList.stream()
            .collect(Collectors.toMap(Employee::getId, Employee::getName, (a, b) -> a));
    
  2. 使用这样的映射进一步创建对象,同时遍历第二个并查找此映射,例如:

    List<Employee> employees = employeeMobileList.stream()
            .filter(item -> empIdToName.containsKey(item.getId()))
            .map(i -> new Employee(i.getId(), empIdToName.get(i.getId()), i.getMobileNo()))
            .collect(Collectors.toList());
    

【讨论】:

  • 注意:这是基于评论中的输出,该输出描述了问题中可能存在错误输入,您寻求的输出是两个列表的合并,以形成具有完整详细信息的员工对象。跨度>
  • 输出为 Employee [id=101, name=Shiv1, mobileNo=1] Employee [id=101, name=Shiv1, mobileNo=2] Employee [id=101, name=Shiv1, mobileNo=3] Employee [id=101, name=Shiv1, mobileNo=4] .... 提供的输出不正确。它必须像 Employee [id=101, name=Shiv1, mobileNo=1] Employee [id=102, name=Shiv2, mobileNo=2] Employee [id=103, name=Shiv3, mobileNo=3] Employee [id= 104,名称=Shiv4,移动编号=4]
  • @imdon 正如我在注释中所说的那样,您的输入是什么真的很重要。使用当前的输入,你怎么能期望输出中有[id=102, name=Shiv2, mobileNo=2]
猜你喜欢
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 2021-03-13
  • 2014-05-08
相关资源
最近更新 更多