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

时间:2015-06-02 09:41:01

标签: java collections java-7 guava

我有一个列表

List<FeatureHolder> featureHolderList;

由FeatureHolder对象组成

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

现在我需要从featureSetList中提取Map。当然,解决方案是微不足道的:

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

问题是,在Java 7中有更好(更短)的方法吗?我已经研究过例如Google Collections和方法Maps.uniqueIndex,但以这种方式执行转换所需的代码会更长,而且可读性更低。

4 个答案:

答案 0 :(得分:4)

使用Java 7,您的代码很好。

或者您可以使用Java 8

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

答案 1 :(得分:2)

我经常会发现是否使用番石榴的决定。根据Guava自己的caveats docu,如果没有净代码行或明显的性能优势,您应该避免使用Guava。

但是,在你的情况下,我没有看到一个简单的方法来创建你的番石榴地图,因为Maps.uniqueIndex只有一个键映射函数,但没有值映射函数。这意味着,您最终会得到Map<String, FeatureHolder>类型的地图。

如果您可以使用Java 8,Collectors.toMap可能是一个选项,但在我的选项中没有什么不能击败您的“普通旧3行易读代码”解决方案,所以请坚持它<!/强>

答案 2 :(得分:0)

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

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

它有点长,但可能会更快,因为没有必要进行重组。

答案 3 :(得分:0)

使用Google收藏夹

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