【问题标题】:How to convert List into HashBasedTable using Java 8?如何使用 Java 8 将 List 转换为 HashBasedTable?
【发布时间】:2020-02-11 09:40:21
【问题描述】:

我们如何在 Java8 中将 List 转换为 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


    【解决方案1】:

    如果这些内部部件至少是 guava-21,您可以通过它们自己的收集器来完成,但我认为您使用简单循环所做的事情没有任何问题。

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

    【讨论】:

      【解决方案2】:

      首先,您不应该依赖内部包,只需将 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。如果需要,相应地更改表收集器中的类型和第三个参数。

      【讨论】:

      • 谢谢。为什么我们不应该使用内部组件?
      • @fatherazrael 1) 依赖任何东西的内部几乎不是一个好主意 2) 你不知道使用的是哪个版本 3) 使用的版本可以随着框架的升级而改变,甚至完全消失离开。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      相关资源
      最近更新 更多