我们有一个项目列表:List<X>
从此列表中,我们想创建Map<F(X), X>
使用Guava com.google.common.collect
,
有Maps.uniqueIndex
方法,它将List作为输入和
允许我们将一个函数应用于元素。
这一切都很棒。例如:
List<File> to Map<String, File>
mapOfFileNames = Maps.uniqueIndex(fileList, new Function<File, String>() {
@Override
public String apply(@Nullable File input) {
return input.getName();
}
});
我的问题是,我们如何在列表中掌握当前项目(索引)的位置,
使用Maps.uniqueIndex
例如,要转换List<File> to Map<Integer, File>
我希望键是List中File元素的位置。
因此我需要访问当前元素的索引。
你知道这怎么可能吗?
谢谢
答案 0 :(得分:8)
你为什么要这样做?鉴于您无论如何都可以通过索引在List
中进行查找,我真的没有看到它的用处。获取Function
中输入项的索引会很浪费,因为您必须为每个项目执行indexOf
。如果你真的想这样做,我会说:
List<File> list = ...
Map<Integer, File> map = Maps.newHashMap();
for (int i = 0; i < list.size(); i++) {
map.put(i, list.get(i));
}
在相关说明中,所有ImmutableCollection
都有asList()
视图,这可以允许您对任何ImmutableMap
进行基于索引的查找。 Maps.uniqueIndex
还会保留原始集合中的订单。使用您的示例:
ImmutableMap<String, File> mapOfFileNames = Maps.uniqueIndex(...);
/*
* The entry containing the file that was at index 5 in the original list
* and its filename.
*/
Map.Entry<String, File> entry = mapOfFileNames.entrySet().asList().get(5);