Похоже, вы должны использовать Collectors.collectingAndThen
.
Сначала создайте экстракторы (при условии, что у ваших классов есть конструкторы и геттеры):
// The cast types are just an example. You can Cast/convert the array values to any type you want
IdName extractIdName(Object[] row) {
return new IdName((String) row[0], (String) row[1], null);
}
Another extractAnother(Object[] row) {
return new Another((String) row[2], (String) row[3], null);
}
Format extractFormat(Object[] row) {
return new Format((String) row[4], (boolean) row[5], (boolean) row[6]);
}
Затем вам понадобятся функции слияния:
List<Another> setFormats(Map<Another, List<Format>> map) {
return map.entrySet()
.stream()
.map(e -> {
e.getKey().setFormatList(e.getValue());
return e.getKey();
})
.collect(toList());
}
List<IdName> setAnothers(Map<IdName, List<Another>> map) {
return map.entrySet()
.stream()
.map(entry -> {
entry.getKey().setAnotherNameList(entry.getValue());
return entry.getKey();
})
.collect(toList());
}
Наконец, это поможет. :
// Converting Object[][] to List<IdName>
List<IdName> list =
Arrays.stream(dbResult)
.collect(
collectingAndThen(
groupingBy(this::extractIdName,
collectingAndThen(
groupingBy(this::extractAnother,
mapping(this::extractFormat, toList())),
this::setFormats
)),
this::setAnothers));
Во-первых, Вы могли бы рассмотреть использование класса для содержания строк внутреннего массива или загрузки его из plist файла (в котором легко сделать 2-й массив строк).
Для прямых объявлений, у Вас есть несколько опций. Если Вы хотите использовать NSArray, необходимо будет вручную создать структуру как это:
NSMutableArray *strings = [NSMutableArray array];
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++)
{
[strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]];
}
Или, с помощью литералов массивов, можно стать неизменными версия как это:
NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ]
можно тогда использовать его как это:
NSString *s = [[strings objectAtIndex:i] objectAtIndex:j];
Это несколько неудобно инициализировать, но это - способ пойти, если Вы хотите использовать методы NSArray.
альтернатива должна использовать массивы C:
NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil
И затем используют его как это:
NSString *s = strings[i][j];
Это является менее неловким, но необходимо стараться , сохраняют/копируют и значения выпуска , поскольку Вы вставляете их к и удаляете их из массива. (Если Вы не используете ARC, конечно!) NSArray сделал бы это для Вас, но с массивами C-стиля, необходимо сделать что-то вроде этого для замены массива:
[strings[i][j] release];
strings[i][j] = [newString retain];
другое различие - то, что можно поместить ноль в массив C-стиля, но не NSArrays - необходимо использовать NSNull для этого. Также смотрите на вопрос о Переполнении стека Какао: управление памятью с NSString для больше об управлении памятью NSString.
Если вы хотите объявить и инициализировать двумерный массив строк, вы можете сделать следующее:
NSArray *myArray = [NSArray arrayWithObjects:
[NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil],
[NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil],
[NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil],
[NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil],
nil];
Это дает вам неизменный массив.