映射到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"