Потоковые операции Java8 на вложенных картах - Карта <String, List <Map>> - PullRequest
0 голосов
/ 07 мая 2018

У меня есть Map следующего вида - Map<String, List<Map<String, String>>>. Содержит элементы в следующем формате:

"1" - [M1, M1, M3]
"2" - [M1, M2, M3]
"3" - [M4]
"4" - [M2, M5]

где,

"1","2","3","4" - ключи внешней карты Map<<b>String</b>, List<Map<String, String>>>. Давайте назовем их outerKey. Итак, M1 s outerKey s "1", "2" оба. Для M2 это "2", "4" и т. Д.

M1, M2, M3, M4, M5 - внутренние карты Map<String, List<<b>Map<String, String></b>>>

Первичным ключом различия между внутренними картами является k1 ключ. (Есть и другие записи на внутренних картах, кроме k1). например:

M1 - { "k1": "m1", "k2": "n1" }, M2 - { "k1": "m2", "k2": "n2" } и т. Д.

Теперь я хочу извлечь список уникальных внутренних карт вместе с его наибольшим значением outerKey. Например, для вышеупомянутого ввода вывод должен быть:

M1 - "2"
M2 - "4"
M3 - "2"
M4 - "3"
M5 - "4"

outerKey также можно вставить внутрь карт, чтобы мы могли получить список карт.

Итак, для образца ввода:

    {
    	"1": [{
    		"k1": "m1",
    		"k2": "n1"
    	}, {
    		"k1": "m1",
    		"k2": "n1"
    	}, {
    		"k1": "m2",
    		"k2": "n2"
    	}],
    	"2": [{
    		"k1": "m1",
    		"k2": "n1"
    	}, {
    		"k1": "m2",
    		"k2": "n2"
    	}, {
    		"k1": "m3",
    		"k2": "n3"
    	}],
    	"3": [{
    		"k1": "m4",
    		"k2": "n4"
    	}],
    	"4": [{
    		"k1": "m2",
    		"k2": "n2"
    	}, {
    		"k1": "m5",
    		"k2": "n5"
    	}]
    }

Use the following code to convert it into Map:

(JSONObject)JSONValue.parseWithException(data)

Вывод будет:

[{
    	"k1": "m1",
    	"k2": "n1",
    	"outerKey": "2"
    }, {
    	"k1": "m2",
    	"k2": "n2",
    	"outerKey": "4"
    }, {
    	"k1": "m3",
    	"k2": "n3",
    	"outerKey": "2"
    }, {
    	"k1": "m4",
    	"k2": "n4",
    	"outerKey": "3"
    }, {
    	"k1": "m5",
    	"k2": "n5",
    	"outerKey": "4"
    }]

У меня возникли проблемы с этим в java8?

Я попытался получить поток Map<String, String> и одновременно добавить запись (outerKey), выполнив следующее:

a.entrySet().stream().flatMap(e -> e.getValue().stream(m -> m.put("outerKey",e.getKey())))

, но возвращает Stream<String>, поскольку map.put возвращает предыдущее значение, связанное с ключом.

Следовательно, я не смог получить Stream<Map> с добавленным entry. Куда я иду не так?

1 Ответ

0 голосов
/ 07 мая 2018

Работы следующие:

a.entrySet()
            .stream()
            .flatMap(e -> e.getValue().stream().map(m -> {m.put("outerKey",e.getKey());return m;}))
            .collect(
                groupingBy(m -> m.get("k1"),collectingAndThen(maxBy(comparing(m -> m.get("outerKey"))),o -> ((Optional)o).get())
                )
            )
            .values()

Вывод:

[{outerKey=2, k1=m1, k2=n1}, {outerKey=4, k1=m2, k2=n2}, {outerKey=2, k1=m3, k2=n3}, {outerKey=3, k1=m4, k2=n4}, {outerKey=4, k1=m5, k2=n5}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...