使用自定义函数从多个源java 8构造对象
我有多个源(映射),其中我存储了与不同属性相关的数据,这些属性用于构造具有id的最终对象。根据此模式,这些映射具有不同的结构: 地图使用自定义函数从多个源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是最终对象FinalObject的标识符
- X1、X2是我的最终对象FinalObject的属性
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());