Java 8: как извлечь HashMap из ArrayList HashMap в Java 8 с использованием потоков? - PullRequest
0 голосов
/ 29 мая 2020
• 1000 Я пробовал использовать Collectors.toMap (), но не уверен, как ссылаться на rollNo как на ключ и на хэш-карту как на значение внутри метода toMap.

Выполненный вывод:

{ rollno1 : { name : name1, rollno: rollno1 } , rollno2 : { name : name2, rollno: rollno2 } }

I попытался сделать это, используя a для каждого l oop в списке, а затем добавив rollno в качестве ключа к хэш-карте и хеш-карту как само значение этого rollno.


    HashMap<String,HashMap<String,String>> newMap = new HashMap();

    for(HashMap<String,String> record : dataList){
        String key = record.get("rollno").toString();
        newMap.put(key,record);
    }

Есть ли способ реорганизовать это код с использованием функциональных потоков в Java 8? Даст ли использование метода streams collect какое-либо преимущество в производительности по сравнению с foreach для этого?

Будут признательны за любые предложения. Спасибо

Ответы [ 5 ]

3 голосов
/ 29 мая 2020

Вы можете использовать Collectors.toMap с Function.identity(), как показано ниже,

list.stream()
        .collect(toMap(e->e.get("rollno"), Function.identity()));
2 голосов
/ 29 мая 2020

Вот полный пример того, как это сделать

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

public class Main {

    public static void main(String[] args) {
        List<HashMap<String, String>> input = new ArrayList<>();
        HashMap<String, String> subinput1 = new HashMap<>();
        subinput1.put("name", "name1");
        subinput1.put("rollno", "rollno1");
        input.add(subinput1);
        HashMap<String, String> subinput2 = new HashMap<>();
        subinput2.put("name", "name2");
        subinput2.put("rollno", "rollno2");
        input.add(subinput2);
        HashMap<String, HashMap<String, String>> result = (HashMap<String, HashMap<String, String>>) input.stream()
                .collect(Collectors.toMap(v -> (String) v.get("rollno"), e -> e));
        System.out.println(result);
    }
}

Он выполняет итерацию по коллекции HashMaps, берет ключ, в котором он должен быть сохранен в результате HashMap, затем создает карту карт, где key - это "rollno" из входной карты, а value - это сама входная карта.

2 голосов
/ 29 мая 2020

Поскольку я не знаю, какой тип объекта вы используете, я выполняю это для String. Но это справедливо для любого типа объекта.

 HashMap result = (HashMap<String, HashMap<String, String>>) listOfHashMaps.stream()
               .collect(Collectors.toMap(e-> e.get("roll"),e->e));

Поскольку приведение типов поможет вам добиться этого.

1 голос
/ 29 мая 2020
public static void main(String[] args) {
    List<HashMap<String, String>> input = new ArrayList<>();

    HashMap<String, String> subinput1 = new HashMap<>();
    subinput1.put("name", "name1");
    subinput1.put("rollno", "rollno1");
    input.add(subinput1);

    HashMap<String, String> subinput2 = new HashMap<>();
    subinput2.put("name", "name2");
    subinput2.put("rollno", "rollno2");
    input.add(subinput2);

    //Test key conflict
    HashMap<String, String> subinput3 = new HashMap<>();
    subinput2.put("name", "name3");
    subinput2.put("rollno", "rollno2");
    input.add(subinput2);

    System.out.println("input:"+ JSONObject.toJSONString(input));

    HashMap<String, HashMap<String, String>> result = (HashMap<String, HashMap<String, String>>) 
       input.stream()
            .collect(Collectors.toMap(
                v -> (String) v.get("rollno"), 
                Function.identity(),(oldValue, newValue) -> newValue
            ));
    //fastjson  hashmap-toString use =
    System.out.println(JSONObject.toJSONString(result));
}
0 голосов
/ 29 мая 2020

Вероятно, что-то вроде этого:

Map<RollNo, List<Roll>> rollsPerType = rolls.stream()
  .collect(groupingBy(Roll::getRollNo));

, где Roll - это главный объект, а RollNo - свойство внутри (поскольку вы не предоставили фактические определения).

...