use*_*426 5 java-8 java-stream
我有这样的课
ObjectA
id
type
Run Code Online (Sandbox Code Playgroud)
其中id是唯一的,但类型可以重复,所以如果我有这样的ObjectA列表
(id, type) = (1, "A") , (2, "B"), (3, "C"), (4, "A")
Run Code Online (Sandbox Code Playgroud)
然后我想要Map<type, List<id>>地图在哪里
< "A",[1,4],
"B",[2],
"C",[3] >
Run Code Online (Sandbox Code Playgroud)
它正在使用Java 7,但无法在Java 8中找到方法.在Java 8中,我可以创建键值对,但如果类型相同则无法创建列表.
yourTypes.stream()
.collect(Collectors.groupingBy(
ObjectA::getType,
Collectors.mapping(
ObjectA::getId, Collectors.toList()
)))
Run Code Online (Sandbox Code Playgroud)
要映射的员工列表
List<Employee> list = new ArrayList<>();
list.add(new Employee(1, "John",80000));
list.add(new Employee(2, "Jack", 90000));
list.add(new Employee(3, "Ricky", 120000));
// key = id, value - name
Map<Integer, String> result1 = list.stream().collect(
Collectors.toMap(Employee::getId, Employee::getName));
Run Code Online (Sandbox Code Playgroud)
虽然你得到了一些很好的答案。我想分享另一种做同样事情的方法。当你必须处理非常复杂的地图转换时。
class Student {
private String name;
private Integer id;
//getters / setters / constructors
}
Map<String, List<Integer>> map = Arrays.asList(
new Student("Jack", 2),
new Student("Jack", 2),
new Student("Moira", 4)
)
.stream()
.collect(
Collectors.toMap(
Student::getName,
student -> {
List list = new ArrayList<Integer>();
list.add(student.getId());
return list;
},
(s, a) -> {
s.add(a.get(0));
return s;
}
)
);
Run Code Online (Sandbox Code Playgroud)
请注意您可以如何复杂地处理值并相应地返回新值。
toMap参数分别是keyMapper函数、valueMapper函数和merge。
干杯!
| 归档时间: |
|
| 查看次数: |
8276 次 |
| 最近记录: |