У меня есть список объектов, из которых я должен создать HashMap<String,String>
или ConcurrentHashMap<String,String>
после применения определенных logi c к каждому из объектов в списке. Вот код, который отлично работает без использования 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
и посмотрим, смогу ли я использовать это для этого варианта использования. Я пытался сделать что-то вроде ниже, но это неправильное использование, так как я не могу вызвать метод parser.getValue с параметрами в toMap()
.
Map<String,String> valMap = parser.getFieldList().stream().collect(Collectors.toMap(Model::getName,parser.getValue(arr,Model::getName),(left,right)->right),HashMap::new);
I смог использовать Collectors.toMap()
, когда я создал POJO ValHolder для хранения значений, как показано ниже.
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;
}
}
Я хотел бы знать, можно ли использовать toMap()
без создания POJO для хранения значений, которые будут легко доступны через ссылки на методы.