Java 8按条件收集两个列表进行映射

mar*_*kin 6 java collections java-8 java-stream

我有一个对象:

public class CurrencyItem {
    private CurrencyName name;
    private BigDecimal buy;
    private BigDecimal sale;
    private Date date;
    //...
}
Run Code Online (Sandbox Code Playgroud)

其中CurrencyName一个是:EUR,USD,RUR等.

还有两个清单

List<CurrencyItem> currenciesByCommercialBank = ...
List<CurrencyItem> currenciesByCentralBank = ...
Run Code Online (Sandbox Code Playgroud)

如何将此列表合并到Map<CurrencyItem, CurrencyItem>键所在的位置,currenciesByCommercialBank并将值currenciesByCentralBank与条件合并为

currenciesByCommercialBank.CurrencyName == currenciesByCentralBank.CurrencyName
Run Code Online (Sandbox Code Playgroud)

Old*_*eon 6

这应该是最佳的.您首先要建立一个从货币到商业银行的地图.然后你穿过你的中心建立一个从商业到中心的地图(在第一张地图中查找).

    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
                    ));
Run Code Online (Sandbox Code Playgroud)