Java 8 如何使用Collectors.toMap从具有列表的对象集中收集地图
我有一个带有列表的class元素,我的预期输出如下:Java 8 如何使用Collectors.toMap从具有列表的对象集中收集地图,java-8,java-stream,collectors,Java 8,Java Stream,Collectors,我有一个带有列表的class元素,我的预期输出如下: Map 我的输入是一组元素对象,我使用了forEach来获得期望的结果,但我正在寻找如何使用collector.toMap来收集它。非常感谢您的任何意见 Set<Element> changes = new HashSet(); List<String> interesetList = new ArrayList(); interesetList.add("1"); interesetList.add("2"); i
Map
我的输入是一组元素对象,我使用了forEach
来获得期望的结果,但我正在寻找如何使用collector.toMap
来收集它。非常感谢您的任何意见
Set<Element> changes = new HashSet();
List<String> interesetList = new ArrayList();
interesetList.add("1");
interesetList.add("2");
interesetList.add("3");
Element element = new Element(interesetList);
changes.add(element);
interesetList = new ArrayList();
interesetList.add("2");
interesetList.add("3");
interesetList.add("4");
element = new Element(interesetList);
changes.add(element);
Map<String, List<Element>> collect2 = new HashMap();
changes.forEach(element -> {
element.getInterestedList().forEach(tracker -> {
collect2.compute(tracker, ( key , val) -> {
List<Element> elementList = val == null ? new ArrayList<Element>() : val;
elementList.add(Element);
return elementList;
});
});
});
class Element {
List<String> interestedList;
static AtomicInteger sequencer = new AtomicInteger(0);
String mName;
public Element(List<String> aList) {
interestedList = aList;
mName = "Element" + sequencer.incrementAndGet();
}
public List<String> getInterestedList() {
return interestedList;
}
@Override
public String toString() {
return mName;
}
}
Set changes=new HashSet();
List InterestList=新建ArrayList();
兴趣列表。添加(“1”);
兴趣列表。添加(“2”);
兴趣列表。添加(“3”);
元素=新元素(兴趣列表);
增加(要素);
兴趣列表=新的ArrayList();
兴趣列表。添加(“2”);
兴趣列表。添加(“3”);
兴趣列表。添加(“4”);
元素=新元素(兴趣列表);
增加(要素);
Map collect2=新的HashMap();
更改。forEach(元素->{
element.getInterestedList().forEach(跟踪器->{
collect2.compute(跟踪器,(键,val)->{
List elementList=val==null?新建ArrayList():val;
元素列表。添加(元素);
返回元素列表;
});
});
});
类元素{
列表兴趣列表;
静态AtomicInteger sequencer=新的AtomicInteger(0);
字符串mName;
公共元素(列表列表列表){
兴趣列表=列表;
mName=“Element”+sequencer.incrementAndGet();
}
公共列表getInterestedList(){
返回兴趣列表;
}
@凌驾
公共字符串toString(){
返回mName;
}
}
您可以使用而不是采集器来执行此操作。toMap
以及,它将采集器适配到另一个采集器:
Map<String, List<Element>> result = changes.stream()
.flatMap(e -> e.getInterestedList().stream().map(t -> Map.entry(t, e)))
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
这使用了,非常适合您的用例。非常感谢您的全面解释和优雅的解决方案。非常有帮助-你能分享你的博客吗?这样我就可以关注你了。再次感谢您。@PathbreakersINDIA是的,谢谢您的支持!
Map<String, List<Element>> result = changes.stream()
.flatMap(e -> e.getInterestedList().stream().map(t -> Map.entry(t, e)))
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toList())));
Map<String, List<Element>> result = new HashMap<>();
changes.forEach(e ->
e.getInterestedList().forEach(t ->
result.computeIfAbsent(t, k -> new ArrayList<>()).add(e)));