【发布时间】: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
假设我有一个字符串列表
["bird", "bird", "dog", "dog", "bird","bog"]
我希望它们以地图的形式收集
{"bird": [0, 1, 4], "dog": [2, 3, 5]}
作为列表的值是单词在输入列表中的索引。
有没有办法用 Java Streams 做到这一点?
【问题讨论】:
标签: java java-8 java-stream grouping
是的,您可以使用IntStream 和Collectors.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]}
【讨论】:
对上述问题稍作改动。
给定一个对象列表,创建一个映射,其中键是“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 的上述回答。
【讨论】: