Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 如何使用Collectors.toMap从具有列表的对象集中收集地图_Java 8_Java Stream_Collectors - Fatal编程技术网

Java 8 如何使用Collectors.toMap从具有列表的对象集中收集地图

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

我有一个带有列表的class元素,我的预期输出如下:
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)));