Собирать как HashMap из списка или потока объектов без POJO в java 8 - PullRequest
3 голосов
/ 27 мая 2020

У меня есть список объектов, из которых я должен создать 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 для хранения значений, которые будут легко доступны через ссылки на методы.

1 Ответ

6 голосов
/ 27 мая 2020

Вам не обязательно использовать ссылку на метод.

Например:

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));
...