【问题标题】:Java Streams list to map index of ocurrence as keyJava Streams列表以映射出现索引作为键
【发布时间】:2018-08-17 19:16:18
【问题描述】:

假设我有一个字符串列表

["bird", "bird", "dog", "dog", "bird","bog"]

我希望它们以地图的形式收集

{"bird": [0, 1, 4], "dog": [2, 3, 5]}

作为列表的值是单词在输入列表中的索引。

有没有办法用 Java Streams 做到这一点?

【问题讨论】:

    标签: java java-8 java-stream grouping


    【解决方案1】:

    是的,您可以使用IntStreamCollectors.groupingBy

    List<String> list = List.of("bird", "bird", "dog", "dog", "bird", "bog");
    
    IntStream.range(0, list.size())
             .boxed()
             .collect(Collectors.groupingBy(list::get));
    

    输出:

    {bird=[0, 1, 4], bog=[5], dog=[2, 3]}
    

    【讨论】:

      【解决方案2】:

      对上述问题稍作改动。

      给定一个对象列表,创建一个映射,其中键是“x”字段,值是与“x”字段具有相同值的对象列表

      @Value
      @RequiredArgsConstructor
      class Employee{
          String Firstname;
          String LastName;
          String Dept;
          Integer Salary;
      }
      
      public class EmployeeStreamTest {
      
          public static void main(String[] args) {
              Employee e1 = new Employee("ABC", "Raval", "Fin", 100);
              Employee e2 = new Employee("BCD", "Raval", "Fin", 100);
              Employee e3 = new Employee("CDE", "Raval", "Fin", 100);
              Employee e4 = new Employee("WXY", "", "Fin", 100);
              Employee e5 = new Employee("XYZ", "", "Fin", 100);
      
              Stream<Employee> es = Stream.of(e1,e2,e3,e4,e5);
      
              //given a list of employees , create a map where Key is last name and value is list of employees with same last name
              Map<String, List<Employee>> lmse = es.collect(Collectors.groupingBy(emp -> emp.getLastName()));
              System.out.println(lmse);
      
          }
      
      }
      

      输出:

      {=[Employee(Firstname=WXY, LastName=, Dept=Fin, Salary=100), Employee(Firstname=XYZ, LastName=, Dept=Fin, Salary=100)], Raval=[Employee(Firstname=ABC, LastName=Raval, Dept=Fin, Salary=100), Employee(Firstname=BCD, LastName=Raval, Dept=Fin, Salary=100), Employee(Firstname=CDE, LastName=Raval, Dept=Fin, Salary=100)]}
      

      感谢@Jacob 的上述回答。

      【讨论】:

        猜你喜欢
        • 2021-02-16
        • 2013-07-23
        • 1970-01-01
        • 2019-01-19
        • 2013-09-28
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多