Java8收集两个列表以按条件映射

Java8收集两个列表以按条件映射,java,collections,java-8,java-stream,Java,Collections,Java 8,Java Stream,我有一个目标: public class CurrencyItem { private CurrencyName name; private BigDecimal buy; private BigDecimal sale; private Date date; //... } 其中,CurrencyName是以下其中之一:欧元、美元、卢布等 和两份清单 List<CurrencyItem> currenciesByCommercialBank

我有一个目标:

public class CurrencyItem {
    private CurrencyName name;
    private BigDecimal buy;
    private BigDecimal sale;
    private Date date;
    //...
}
其中,
CurrencyName
是以下其中之一:欧元、美元、卢布等

和两份清单

List<CurrencyItem> currenciesByCommercialBank = ...
List<CurrencyItem> currenciesByCentralBank = ...
下面的代码是O(n2),但对于小集合(您的列表可能是这样的)应该可以:


在这种情况下,映射将包含所有匹配项,并且不会抱怨缺少条目。

这应该是最佳选择。您首先构建一张从货币到商业银行的地图。然后,通过中心线构建一个从商业到中心的地图(在第一个地图中查找)

List currencesbycommercialbank=new ArrayList();
List CurrencesByCentralBank=新建ArrayList();
//从CurrencyName到CommercialBank构建我的查找。
Map commercials=商业银行的货币
.stream()
.收集(
汤姆(
//从货币名称映射。
ci->ci.getName(),
//给商业银行本身。
ci->ci);
Map commercialToCentral=中央银行的货币
.stream()
.收集(
汤姆(
//等效商业地图
ci->commercials.get(ci.getName()),
//到这个中心。
ci->ci
));
currenciesByCommercialBank.CurrencyName == currenciesByCentralBank.CurrencyName
return currenciesByCommercialBank
    .stream()
    .map(c ->
        new AbstractMap.SimpleImmutableEntry<>(
            c, currenciesByCentralBank.stream()
                                      .filter(c2 -> c.currencyName == c2.currencyName)
                                      .findFirst()
                                      .get()))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
  }
currenciesByCommercialBank
    .stream()
    .flatMap(c ->
        currenciesByCentralBank.stream()
                               .filter(c2 -> c.currencyName == c2.currencyName)
                               .map(c2 -> new AbstractMap.SimpleImmutableEntry<>(c, c2)))
    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
    List<CurrencyItem> currenciesByCommercialBank = new ArrayList<>();
    List<CurrencyItem> currenciesByCentralBank = new ArrayList<>();
    // Build my lookup from CurrencyName to CommercialBank.
    Map<CurrencyName, CurrencyItem> commercials = currenciesByCommercialBank
            .stream()
            .collect(
                    Collectors.toMap(
                            // Map from currency name.
                            ci -> ci.getName(),
                            // To the commercial bank itself.
                            ci -> ci));
    Map<CurrencyItem, CurrencyItem> commercialToCentral = currenciesByCentralBank
            .stream()
            .collect(
                    Collectors.toMap(
                            // Map from the equivalent commercial
                            ci -> commercials.get(ci.getName()),
                            // To this central.
                            ci -> ci
                    ));