Как преобразовать List в HashBasedTable, используя Java 8?

Как мы можем преобразовать список в HashBasedTable в Java8?

Текущий код похож на:

import org.glassfish.jersey.internal.guava.HashBasedTable;
import org.glassfish.jersey.internal.guava.Table;

List<ApplicationUsage> appUsageFromDB = computerDao.findAllCompAppUsages(new HashSet<>(currentBatch));
Table<String, String, Integer> table = HashBasedTable.create();
for(ApplicationUsage au: appUsageFromDB) {
  table.put(au.getId(), au.getName(), au);
}

Мне нужно сохранить составной ключ в этом, а затем получить то же самое.

Всего 2 ответа


Если эти внутренние компоненты по крайней мере guava-21, вы можете сделать это через их собственный сборщик, но я не вижу ничего плохого в том, что вы делаете с простым циклом.

Table<String, String, ApplicationUsage> result =
        appUsageFromDB.stream()
                      .collect(ImmutableTable.toImmutableTable(
                          ApplicationUsage::getId,
                          ApplicationUsage::getName,
                          Function.identity()
                      ));

Во-первых, вы никогда не должны полагаться на внутренние пакеты, просто явно добавьте Guava в свой проект. Вы можете использовать сборщик Tables#toTable , если вы хотите, чтобы в результате была изменяемая таблица, в противном случае неизменная таблица, представленная в ответе @ Eugene, вполне подходит:

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;

// ...

    Table<String, String, ApplicationUsage> table2 = appUsageFromDB.stream()
            .collect(Tables.toTable(
                    ApplicationUsage::getId,
                    ApplicationUsage::getName,
                    au -> au,
                    HashBasedTable::create
            ));

Кроме того, ваш код не компилируется, потому что он ожидает Integer качестве табличного значения, но вы добавляете ApplicationUsage в свой цикл. При необходимости измените типы и третий аргумент в сборщике таблицы.


Есть идеи?

10000