映射到Java 11的嵌套流

映射到Java 11的嵌套流,java,java-stream,java-11,java-16,Java,Java Stream,Java 11,Java 16,假设您有一个接口、两个实现类和一个枚举,如下所示: 接口: public interface Employee { // No two employees will have same favorite hobbies List<Hobby> favoriteHobbies; } 我有 List employees=List.of(Employee1,Employee2) 使用Streams,我想通过员工列表进行流式处理,然后再次通过每个员工对象的收藏夹爱好()进

假设您有一个接口、两个实现类和一个枚举,如下所示: 接口:

public interface Employee {
    // No two employees will have same favorite hobbies
    List<Hobby> favoriteHobbies; 
}
我有
List employees=List.of(Employee1,Employee2)

使用Streams,我想通过
员工
列表进行流式处理,然后再次通过每个员工对象的
收藏夹爱好()
进行流式处理,并创建一个
映射
,如下所示:

"swimming" -> "Employee1"
"dancing" -> "Employee1"
"running" -> "Employee2"

我将在
流中创建一个
Map.Entry
,然后使用其键和值收集它

因为可以使用
Stream#mapMulti

Map Map=employees.stream()
.mapMulti((员工,消费者)这可以通过
流#平面图
收集器#toMap

Map Map=employees.stream()
.flatMap(employee->employee.favorite嗜好()
.stream()
.map(爱好->新建抽象地图.SimpleEntry(爱好,员工)))
.collect(collector.toMap)(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue,
(entryOne,entryTwo)->entryOne//或者其他什么,甚至可能抛出新的XXXException()
));
产生


我将在
流中创建一个
映射项
,然后使用其键和值收集它

因为可以使用
Stream#mapMulti

Map Map=employees.stream()
.mapMulti((员工,消费者)这可以通过
流#平面图
收集器#toMap

Map Map=employees.stream()
.flatMap(employee->employee.favorite嗜好()
.stream()
.map(爱好->新建抽象地图.SimpleEntry(爱好,员工)))
.collect(collector.toMap)(
AbstractMap.SimpleEntry::getKey,
AbstractMap.SimpleEntry::getValue,
(entryOne,entryTwo)->entryOne//或者其他什么,甚至可能抛出新的XXXException()
));
产生


由于可以使用Java 9,因此还应构造一个
LinkedHashMap
,以保持映射项的插入顺序:

Map Map=employees()
.stream()
.flatMap(e->e.FavoriteHabiots().stream().map(h->map.entry(h,e)))
.collect(collector.toMap)(
Map.Entry::getKey,
Map.Entry::getValue,
(a,b)->a,
LinkedHashMap::新建
));
但是,如果输入的
employees
列表包含不同实现的多个实例,那么使用
Stream::flatMap
Collectors::groupingBy
Collectors::mapping
Collectors::toList
,构建映射将更有意义:

List employeeList=List.of(
新员工1(“约翰”)、新员工1(“杰克”)、新员工2(“杰夫”),
新员工1(“杰克”),新员工2(“琼”)
);
映射列表=员工()
.stream()
.flatMap(e->e.FavoriteHabiots().stream().map(h->map.entry(h,e)))
.collect(收集器.groupingBy(
Map.Entry::getKey,
LinkedHashMap::新建,
Collectors.mapping(Map.Entry::getValue,Collectors.toList())
));

由于可以使用Java 9,因此还应构造一个
LinkedHashMap
,以保持映射项的插入顺序:

Map Map=employees()
.stream()
.flatMap(e->e.FavoriteHabiots().stream().map(h->map.entry(h,e)))
.collect(collector.toMap)(
Map.Entry::getKey,
Map.Entry::getValue,
(a,b)->a,
LinkedHashMap::新建
));
但是,如果输入的
employees
列表包含不同实现的多个实例,那么使用
Stream::flatMap
Collectors::groupingBy
Collectors::mapping
Collectors::toList
,构建映射将更有意义:

List employeeList=List.of(
新员工1(“约翰”)、新员工1(“杰克”)、新员工2(“杰夫”),
新员工1(“杰克”),新员工2(“琼”)
);
映射列表=员工()
.stream()
.flatMap(e->e.FavoriteHabiots().stream().map(h->map.entry(h,e)))
.collect(收集器.groupingBy(
Map.Entry::getKey,
LinkedHashMap::新建,
Collectors.mapping(Map.Entry::getValue,Collectors.toList())
));

非常感谢!很高兴知道Java-16是如何简化的。非常感谢!很高兴知道Java-16是如何简化的。
public enum Hobby {
    swimming,
    running,
    dancing
}
"swimming" -> "Employee1"
"dancing" -> "Employee1"
"running" -> "Employee2"