使用Java8流在嵌套数据结构上创建地图 - java

我正在使用Java 8的流来搜索这段代码的优雅用法:

Collection<X> xs = ...;
Map<B, A> map = new SomeMap<>();

for (X x : xs) {
    A a = x.getA();
    Collection<B> bs = x.getBs();

    for (B b : bs)
        map.put(b, a);
}

这对我来说有点棘手,因为我想不起来使用flatMap和Collectors.toMap的组合来实现所需的功能。

编译示例:

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class Application {

    public static class A {}

    public static class B {}

    public static class X {
        private A a;
        private Collection<B> bs;

        public X(A a, Collection<B> bs) {
            this.a = a;
            this.bs = bs;
        }

        public A getA() {
            return a;
        }

        public Collection<B> getBs() {
            return bs;
        }
    }

    public static void main(String[] args) {
        X x1 = new X(new A(), Arrays.asList(new B(), new B()));
        X x2 = new X(new A(), Arrays.asList(new B()));

        Collection<X> xs = Arrays.asList(x1, x2);

        Map<B, A> map = new HashMap<>();

        for (X x : xs) {
            A a = x.getA();
            Collection<B> bs = x.getBs();

            for (B b : bs)
                map.put(b, a);
        }
    }

}

参考方案

如您所愿,可以将flatMap和toMap混合使用:

Map<B, A> map = xs.stream()
                  .flatMap(x -> x.getBs().stream()
                                 .map(b -> new SimpleEntry<> (b, x.getA())))
                  .collect(toMap(Entry::getKey, Entry::getValue));

请注意,如果B重复,则此代码与原始代码不同:您的代码将继续覆盖相应的值,而此代码将引发异常。

Java中的<<或>>>是什么意思? - java

This question already has answers here: Closed 7 years ago. Possible Duplicate: What does >> and >>> mean in Java?我在一些Java代码中遇到了一些陌生的符号,尽管代码可以正确编译和运行,但对于括号在此代码中的作用却感…

菱形运算符<>是否等于<?> - java

我在util.TreeSet类中发现,其中一个构造函数正在使用具有空泛型类型的新TreeMap调用另一个构造函数。 public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); } new TreeMap<>是什么意思…

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

Java:正则表达式模式匹配器是否有大小限制? - java

我的模式类似于OR:“word1 | word2 | word3”我大约有800个字。可能有问题吗? 参考方案 您仅受记忆和理智的限制。 :)

Java中的“ <<”运算符 - java

最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…