使用自定义函数从多个源java 8构造对象

使用自定义函数从多个源java 8构造对象,java,design-patterns,java-8,java-stream,Java,Design Patterns,Java 8,Java Stream,我有多个源(映射),其中我存储了与不同属性相关的数据,这些属性用于构造具有id的最终对象。根据此模式,这些映射具有不同的结构: 地图 id是最终对象FinalObject的标识符 X1、X2是我的最终对象FinalObject的属性 在real code中,我有几个映射,如下所示: Map<Integer, String> descriptions; Map<Integer, Double> prices; Map<Integer, Double> qua

我有多个源(映射),其中我存储了与不同属性相关的数据,这些属性用于构造具有id的最终对象。根据此模式,这些映射具有不同的结构:

地图

  • id是最终对象FinalObject的标识符
  • X1、X2是我的最终对象FinalObject的属性
在real code中,我有几个映射,如下所示:

Map<Integer, String> descriptions;
Map<Integer, Double> prices;
Map<Integer, Double> quantities;
Map<Integer, String> currencies;

这段代码不编译,为了更好地理解我的问题。

获取id号流

descriptions.keySet().stream()
…然后在四个地图中查找ID:

descriptions.keySet().stream()
    .map(id -> {
         String description = descriptions.get(id);
         Double price       = prices      .get(id);
         Double quantity    = quantities  .get(id);
         String currency    = currencies  .get(id);

         return new FinalObject(description, price, quantity, currency);
    });
这假设
descriptions
对每个id都有一个条目。如果没有,请根据需要进行调整

如果希望,可以通过迭代
entrySet()
而不是
keySet()
来保存一次查找


让我们假设
FinalObject
是不可变的,并且具有以下结构:

public static class FinalObject {

    private final String description;
    private final Double price;
    private final Double quantity;
    private final String currency;

    // constructor
首先,使用地图中的所有ID创建一个集合。根据
集合
特征,值是不同的:

final Set<Integer> idSet = new HashSet<>();
idSet.addAll(descriptions.keySet());
idSet.addAll(prices.keySet());
idSet.addAll(quantities.keySet());
idSet.addAll(currencies.keySet());
final Set idSet=new HashSet();
idSet.addAll(descriptions.keySet());
idSet.addAll(prices.keySet());
idSet.addAll(数量.keySet());
idSet.addAll(currences.keySet());
然后,您可以使用非常简洁的方式来构造对象:

final List<FinalObject> list = idSet.stream()
    .map(id -> new FinalObject(
            descriptions.get(id),
            prices.get(id),
            quantities.get(id),
            currencies.get(id)))
    .collect(Collectors.toList());
final List=idSet.stream()
.map(id->新建最终对象(
descriptions.get(id),
价格。获取(id),
数量。获取(id),
货币。获取(id)))
.collect(Collectors.toList());

完美答案。我已经知道地图功能了,但是完全没有考虑使用这个明显的例子。非常感谢!
final Set<Integer> idSet = new HashSet<>();
idSet.addAll(descriptions.keySet());
idSet.addAll(prices.keySet());
idSet.addAll(quantities.keySet());
idSet.addAll(currencies.keySet());
final List<FinalObject> list = idSet.stream()
    .map(id -> new FinalObject(
            descriptions.get(id),
            prices.get(id),
            quantities.get(id),
            currencies.get(id)))
    .collect(Collectors.toList());