在 Java 中维护传递映射

Maintain a transitive mapping in Java

场景

class A{
  String aId;
;}
class B{
  String bId;
;}
class C{
  String bId;
;}
class D{
    B b;
    C c;
;}

我有一个List<A>。我使用 for 循环遍历此列表,执行一些数据库操作并创建 List<B>。我需要一个从 A 到 B 的映射,所以我也创建了一个 Map<A,B>

从这个 List<B>,我进行了批量 API 调用并获取了一个 List<D>。我还需要从 B 到 C 的映射,所以我遍历这个 List<D> 并创建一个 Map<B,C> .

我的主要要求是从 A 到 C 的映射。我无法删除批量 API 调用,但想删除维护两个映射的额外开销。有什么方法可以维护传递映射,即直接在 JAVA 中 A 到 C 的映射?

您可以按如下方式生成它:

for 循环

import java.util.HashMap;
import java.util.Map;

public class Main
{

    public static void main(String[] args)
    {
        Map<String,String> m1= new HashMap<>();
        Map<String,String> m2 = new HashMap<>();
        m1.put("aaa", "bbb");
        m2.put("bbb", "ccc");
        Map<String,String> combined = new HashMap<>();
        for(String key : m1.keySet())
        {
            // TODO: add error handling or make sure get never returns null 
            combined.put(key, m2.get(m1.get(key)));
        }
        System.out.println(combined.get("aaa"));
    }
}

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;;

public class Main
{

    public static void main(String[] args)
    {
        Map<String,String> m1= new HashMap<>();
        Map<String,String> m2 = new HashMap<>();
        m1.put("aaa", "bbb");
        m2.put("bbb", "ccc");
        Map<String,String> combined = m1.keySet().stream().collect(Collectors.toMap( Function.identity(), x->m2.get(m1.get(x))));
        System.out.println(combined);
    }

}

编辑:根据要求,添加了一个使用流的版本,尽管我更喜欢第一个版本。