Java 8 Преобразование простого списка в карту - PullRequest
1 голос
/ 13 января 2020
import java.util.function.*;
import java.util.*;
public class Main
{
    public static void main(String[] args) {
        List<Integer> newList = new ArrayList<Integer>();
        newList.add(1);
        newList.add(2);
        newList.add(3);
        newList.add(4);

        Map<Integer,String> formMap = new LinkedHashMap<Integer,String>(); 
        Function<Integer,Map<Integer,String>> myFunc = i->{
          if(i%2==0)
          {
              formMap.put(i,"even");
          }
          return formMap;
        };

        Map<Integer,String> newMap = newList.stream().map(i->myFunc.apply(i)).collect(Collectors.toMap(
        entry -> entry.getKey(), // keyMapper
        entry -> entry.getValue(), // valueMapper
        (first, second) -> first,  // mergeFunction
        () -> new LinkedHashMap<>() // mapFactory
    ));

    }
}

Как преобразовать простой список, как указано выше, в карту, выполнив некоторые операции над объектами в списке и затем поместив его в карту. Я взял приведенный выше код Collectors.toMap () только из net. Пожалуйста, помогите мне с вышеуказанным запросом / кодом.

1 Ответ

4 голосов
/ 13 января 2020

Ваш map шаг преобразует Stream<Integer> в Stream<Map<Integer,String>>. Чтобы собрать это Stream в один Map, вы можете написать:

Map<Integer,String> newMap = 
    newList.stream()
           .flatMap(i->myFunc.apply(i).entrySet().stream())
           .collect(Collectors.toMap(Map.Entry::getKey, // keyMapper
                                     Map.Entry::getValue, // valueMapper
                                     (first, second) -> first,  // mergeFunction
                                     LinkedHashMap::new)); // mapFactory

или

Map<Integer,String> newMap = 
    newList.stream()
           .map(myFunc)
           .flatMap(m->m.entrySet().stream())
           .collect(Collectors.toMap(Map.Entry::getKey, // keyMapper
                                     Map.Entry::getValue, // valueMapper
                                     (first, second) -> first,  // mergeFunction
                                     LinkedHashMap::new)); // mapFactory

Конечно, если вам нужно отфильтровать нечетные числа и сопоставить оставшиеся числа с «четными», вы можете просто написать:

Map<Integer,String> newMap = 
    newList.stream()
           .filter(i -> i % 2 == 0)
           .collect(Collectors.toMap(Function.identity(),
                                     i -> "even",
                                     (first, second) -> first,
                                     LinkedHashMap::new));
...