Как сопоставить объекты из списка с данными из карты с условием и сохранить на другую карту с помощью Java 8 Streams - PullRequest
2 голосов
/ 22 сентября 2019

В поисках решения, как сопоставить объекты из списка с данными из карты с условием, если поле объекта начинается со значений карты и сохранить на другой карте

У меня есть карта с некоторыми данными

Map<String, String> dataMap = new HashMap()
    dataMap.put("d1", "DATA1")
    dataMap.put("d2", "DATA2")
    dataMap.put("d3", "DATA3")

и список объектов DataElement

    List<DataElement> elements = new ArrayList()

elements.add(new DataElement("TEXT1"))
elements.add(new DataElement("TEXT2"))
elements.add(new DataElement("DATA1_text1"))
elements.add(new DataElement("DATA2_text2"))


class DataElement {
            public field;


        public DataElement(String text){
            this.field = text
        }

        public getField(){
            return this.field
        }


    }

И я пытаюсь получить новую карту, где ключи - это значения из первой карты, а значения - это объекты (поле) из списка с условием, если поле объекта начинается со значения карты:Результат должен быть:

[d1=DATA1_text1, d2=DATA2_text2]  

Мой код:

    Map<String, String> collect2 = dataMap.entrySet().stream()
            .filter({ map -> elements.stream()
                                .anyMatch({ el -> el.getField().startsWith(map.getValue()) })})
            .collect(Collectors.toMap(KEY, VALUE))

1 Ответ

3 голосов
/ 22 сентября 2019

Надеюсь, я правильно понял вопрос:

Map<String, String> collect2 = 
    dataMap.entrySet()
          .stream()
          .map(e -> elements.stream()
                            // this will search for the first element of the List matching
                            // the value of the current Entry, if exists
                            .filter(el -> el.getField().startsWith(e.getValue()))
                            .findFirst()
                            // this will create a new Entry having the original key and the
                            // value obtained from the List
                            .map(el -> new SimpleEntry<>(e.getKey(),el.getField()))
                            // if findFirst found nothing, map to a null element
                            .orElse(null))
          .filter(Objects::nonNull) // filter out all the nulls
          .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Вы обрабатываете записи ввода Map и сохраняете только те записи, значение которых соответствует элементу List (через filter(), хотя у вас есть некоторые синтаксические ошибки), но вам нужно map вводить записи в новые записи, содержащие желаемое новое значение.

Этот код выше выдает Map

{d1=DATA1_text1, d2=DATA2_text2}

для данного ввода.

...