[英]Collect HashMap<String,Object> from Stream<T>
[英]Collect as HashMap<String,String> from a List or Stream of objects without a POJO in java 8
我有一个对象列表,在对列表中的每个对象应用某些逻辑之后,我必须从中创建一个HashMap<String,String>
或ConcurrentHashMap<String,String>
。 这是在不使用 java 8 的情况下工作得很好的代码。
for (Model model : parser.getList()) {
String name = model.getName();
String val = parser.getValue(arr, name);
map.putIfAbsent(name, val);
}
我能够将其翻译为
Map<String, String> map = new HashMap<>();
parser.getList().forEach(model -> map.putIfAbsent(model.getName(),parser.getValue(arr,model.getName())));
但是我想探索Collectors.toMap
的用法,看看我是否可以在这个用例中利用它。 我试图做类似下面的事情,但这不是正确的用法,因为我无法使用toMap()
中的参数调用parser.getValue方法。
Map<String,String> valMap = parser.getFieldList().stream().collect(Collectors.toMap(Model::getName,parser.getValue(arr,Model::getName),(left,right)->right),HashMap::new);
当我创建一个 POJO ValHolder 来保存如下值时,我能够使用Collectors.toMap()
。
Map<String,String> tranMap = parser.getFieldList().stream().map(model -> {
return new ValHolder(model.getName(),parser.Value(dataArray,model.getName()));
}).collect(Collectors.toMap(ValHolder::getName,ValHolder::getValue,(x,y)->y,HashMap::new));
为保存该值而创建的 POJO 如下所示
class ValHolder {
String name;
String value;
public String getName() {
return name;
}
public String getValue() {
return value;
}
ValHolder(String name, String val){
fieldName = name;
value = val;
}
}
我想知道是否可以在不创建 POJO 的情况下使用toMap()
来保存可以通过方法引用轻松访问的值。
您不必使用方法参考。
例如:
Map<String,String> valMap =
parser.getFieldList()
.stream()
.collect(Collectors.toMap(Model::getName,
m -> parser.getValue(arr,m.getName()),
(left,right)->right,
HashMap::new));
或者,您可以使用Map.Entry
实现而不是您的 POJO:
Map<String,String> tranMap =
parser.getFieldList()
.stream()
.map(model -> new SimpleEntry<>(model.getName(),parser.getValue(dataArray,model.getName())))
.collect(Collectors.toMap(Map.Entry::getKey,
Map.Entry::getValue,
(x,y)->y,
HashMap::new));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.