这是一种方法:
List<String> list = Arrays.asList("a", "b", "c");
Map<String, Integer> map =
IntStream.range(0, list.size())
.boxed()
.collect(toMap(i -> list.get(i), i -> i));
不一定是单行或比直接循环更短,但如果将toMap 更改为toConcurrentMap,它确实可以使用并行流。
另外请注意,这假设您有一个随机访问列表,而不是一般的Collection。如果您有一个 Collection ,否则您无法做出任何假设,那么除了按顺序迭代它并增加一个计数器之外,您无能为力。
更新
OP 已澄清输入是Collection 而不是List,因此上述内容不适用。似乎我们可以对输入Collection 做出很少的假设。 OP 已指定迭代顺序。使用顺序迭代器,元素将以 some 顺序出现,尽管不能保证它。它可能会从一个运行到另一个运行,甚至从一个迭代到下一个迭代(尽管这在实践中是不寻常的——除非底层集合被修改)。
如果需要保留确切的迭代顺序,我认为没有办法将其保留到结果 Map 中而不依次迭代输入 Collection。
但是,如果确切的迭代顺序并不重要,并且要求输出 Map 对每个输入元素具有唯一值,则可以并行执行类似的操作:
Collection<String> col = apiCall();
Iterator<String> iter = col.iterator();
Map<String, Integer> map =
IntStream.range(0, col.size())
.parallel()
.boxed()
.collect(toConcurrentMap(i -> { synchronized (iter) { return iter.next(); }},
i -> i));
现在这远单线。我也不清楚它有多大用处。 :-) 但它确实表明可以并行执行类似的操作。请注意,我们必须同步对输入集合的迭代器的访问,因为它将从多个线程中调用。另请注意,这是迭代器的不寻常用法,因为我们从不调用hasNext,并且我们假设调用next 的次数与输入集合的size() 返回的次数完全相同。