Список <T>и Список <V>карта на новую карту - PullRequest
1 голос
/ 31 марта 2020

если у меня два списка.

первый - это список:

[
{
  "A":"code1"
  "B":"1"
},
{
  "A":"code2"
  "B":"1,2"
},
{
  "A":"code3"
  "B":"2,3"
}
]

, а второй - список:

[
{
  "C":"target1"
  "D":"1"
},
{
  "C":"target2"
  "D":"2"
},
{
  "C":"target3"
  "D":"3"
}
]

теперь мне нужна новая карта

"code1" = "target1","code2" = "target1,target2","code3" = "target2,target3"

правило, когда

List<Object1>.getB().contains(List<Object2>.getD())

Я сопоставляю его с новой картой, заменим C на B.

Я могу использовать double для сделайте это.

например:

public void dosome(){
        Map<String,List<String>> map = new HashMap<>();
        for(Object1 object1 : object1s){
            List<String> list = new ArrayList<>();
            for(Object2 object2 : object2s){
                if(object1.getB().contains(object2.getD())){
                    list.add(object2.getC());
                }
            }
            map.put(object1.getA(),list);
        }
        System.out.println(map);
    }

Но я хочу изменить использование двойного круга "for" на использование stream () (java8), чтобы сделать мой код красивее!

1 Ответ

0 голосов
/ 31 марта 2020

Если вы ищете функциональное решение, вот один из способов сделать это в функциональном стиле:

Map<String, List<String>> map =
        object1s.stream()
                .collect(toMap(Object1::getA,
                               o1 -> object2s.stream()
                                             .filter(o2 -> o1.getB().contains(o2.getD()))
                                             .map(Object2::getC)
                                             .collect(toList()),
                               (a, b) -> b));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...