如何使用Java 8将List转换为HashBasedTable?

问题描述 投票:0回答:2

如何在Java8中将列表转换为HashBasedTable?

当前代码如下:

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);
}

我需要在其中存储复合密钥,以后再获取相同的密钥。

java-8 hashmap guava guava-table
2个回答
1
投票

如果这些内部结构至少是番石榴21,您可以通过其自己的收集器进行操作,但是我看不到您通过简单循环进行的操作有什么问题。

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

1
投票

首先,您永远不要依赖内部软件包,只需将番石榴明确地添加到您的项目中。如果您想要使结果表可变,则可以使用Tables#toTable收集器,否则@Eugene答案中给出的不可变表就可以了:

Tables#toTable

而且,您的代码无法编译,因为它希望将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。如果需要,请在表收集器中相应地更改类型和第三个参数。

© www.soinside.com 2019 - 2024. All rights reserved.