Скажите, у меня есть класс foo
:
class foo {
String someString;
List<String> someList;
}
Если у меня есть список foo
, есть ли способ для меня создать новый список / массив / что угодно из foo
с переназначенными значениями someString
и someList
? Например:
arr1: [
foo {
someString: 'test1',
someList: ['a', 'b']
},
foo {
someString: 'test2',
someList: ['b', 'c']
}
]
станет
arr2: [
foo {
someString: 'a',
someList: ['test1']
},
foo {
someString: 'b',
someList: ['test1', 'test2']
},
foo {
someString: 'c',
someList: ['test2']
},
]
Прямо сейчас у меня есть вложенный цикл, который перебирает каждый элемент someList
для каждого foo и компилирует их в карту, где ключом является значение someList
, а значением является набор значений someString
которые пришли из foos, где присутствовало значение someList
. Затем создайте карту набора записей, чтобы преобразовать ее в новые foos с ключом и значением, переданным в качестве параметров конструктора.
Map<String, Set<String>> myMap;
for(foo f : arr1) {
for(String s : f.someList) {
Set<String> mySet = myMap.get(s);
if(mySet == null) {
myMap.put(s, new HashSet<String>(Arrays.asList(f.someString)));
} else {
mySet.add(f.someString);
}
}
}
List<String> myNewList = myMap.entrySet()
.stream()
.map(e ->
new foo(e.key, new ArrayList<String>(e.value)))
.collect(Collectors.toList());
Кажется, что он работает нормально, но он не самый красивый в мире, поэтому мне было интересно, есть ли другой подход к этому.