从 Java 中的 List 中提取 Map 的最短方法

Shortest way to extract Map from List in Java

我有一个清单

List<FeatureHolder> featureHolderList;

由 FeatureHolder 对象组成

public class FeatureHolder {
   private String  flag;
   private String  value;
}

现在我需要从 featureSetList 中提取地图。解决方案当然很简单:

    Map<String, String> map = new HashMap<>();
    for(FeatureHolder fh: featureHolderList){
        map.put(fh.getFlag(), fh.getValue());
    }

问题是,在 Java7 中是否有更好(更短)的方法?我调查过例如Google 集合和方法 Maps.uniqueIndex,但以这种方式执行转换所需的代码会更长,而且可以说可读性较差。

你的代码很好,你不太可能在 Java 7 中把它写得更短。为了让它更优化一点,你可以为 HashMap 添加一个默认容量,如果你期望的话所有标志都不同:

Map<String, String> map = new HashMap<>(fhList.size());

它有点长,但可能会更快,因为不需要重新散列。

with Java 7,你的代码没问题。

或者您可以使用 Java 8

Map<String, Item> map = list.stream()
                        .collect(Collectors.toMap(Item::getKey,
                                                  item -> item));

使用Google 集合

Map<String, String> map = Maps.uniqueIndex(yourList, Functions.toStringFunction());

我常常觉得决定是否使用 Guava 并不困难。根据 Guava 自己的 caveats docu,如果没有 净节省代码行数 或明显的性能优势,您应该避免使用 Guava。

但是,在您的情况下,我首先没有看到使用 Guava 创建 Map 的简单方法,因为 Maps.uniqueIndex 仅带有键映射功能,但没有值映射功能。这意味着,您最终会得到类型为 Map<String, FeatureHolder>.

的地图

如果你可以使用 Java 8,Collectors.toMap 可能是一个选项,但在我的选项中,没有什么比你的 "plain old 3 lines of easy to read code" 解决方案更好的了,所以 请坚持下去!