Как использовать jdk8 для группировки и фильтрации ArrayList <Object> - PullRequest
0 голосов
/ 01 ноября 2019

Вот объект вызова пн. Он имеет два атрибута, начало и конец, оба являются String. Конечный атрибут может содержать «;»вот так

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");
Mon m4 = new Mon(); m4.setStart("A"); m4.setEnd("c");

А вот ArrayList.

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);list.add(m4);

Теперь я хочу сгруппировать список по начальному attr и конечному attr, но база на конце содержит ";", поэтому я также хочу поместить m1 и m2 в одну группу, потому что m1.end содержит m2.end, но m4 находится в другой группе, так как начало и конец m4 не совпадает с m1, m2.

Я пытался использовать Collectors.groupingBy для группировки по началу

Map<String, List<Mon>> map = list.stream().collect(Collectors.groupingBy(d -> d.getStart()));

Но это не тот результат, который мне нужен. Вывод такой:

key: Aa;b OR Ab , value: m1, m2
key: Cc, value: m3
key: Ac, value: m4

Есть ли способреализовать это, также функция потока JDK8 лучше

Большое спасибо

1 Ответ

1 голос
/ 01 ноября 2019

Следующее должно предоставить вам ожидаемый результат ..

Mon m1 = new Mon(); m1.setStart("A"); m1.setEnd("a;b");
Mon m2 = new Mon(); m2.setStart("A"); m2.setEnd("b");
Mon m3 = new Mon(); m3.setStart("C"); m3.setEnd("c");

List<Mon> list = new ArrayList();
list.add(m1);list.add(m2);list.add(m3);

Function<Mon, String> compositeKey = mon -> mon.getStart()+mon.getEnd();

Map<String, List<Mon>> resultMap = list.stream().collect(Collectors.groupingBy(compositeKey,Collectors.toList()));

ПРИМЕЧАНИЕ: Для вашего соответствия уровня символов в ключе, вы должны будете написать лямбда-выражение в list.stream().forEach(){ mon ->.... Я недумаю, что сложное требование не может быть исправлено функциями OOB. Даже функции Hashmap основаны на точном совпадении клавиш. И если я увижу ожидаемый результат, это даже не полное совпадение key: Aa;b OR Ab

final Map<String, List<Mon>> resultMap = new HashMap();
list.stream().forEach(mon -> {
     resultMap.put(mon.getStart()+getEnd(), ....);
});

Удачи, но, честно говоря, это устаревшая реализация, в которой вы хотите применить сопоставление char в ключе Map. Не уверен, какую цель ты пытаешься достичь с его помощью.

...