Java 如何转换列表<;数据对象>;映射<;整数,字符串>;使用流

Java 如何转换列表<;数据对象>;映射<;整数,字符串>;使用流,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个物品清单。我想做以下几件事 for (int i = 0; i < sorted.size(); i++) { map.put(i, sorted.get(i).getName()); } for(int i=0;ii,i->sorted.get(i).getName()); 这将创建一个从0到列表大小的int流,并将每个值收集到一个映射中。由于您希望将元素收集到一个数据结构中,该数据结构本质上跟踪作为其大小的位置,您可以使用自定义收集器执行该操作: Map<In

我有一个物品清单。我想做以下几件事

for (int i = 0; i < sorted.size(); i++) {
    map.put(i, sorted.get(i).getName());
}
for(int i=0;i

在Java8StreamsAPI中有没有一种简单的方法可以做到这一点

您可以执行以下操作:

Map<Integer, String> map =
        IntStream.range(0, sorted.size())
                 .boxed()
                 .collect(toMap(i -> i, i -> sorted.get(i).getName()));
地图=
IntStream.range(0,sorted.size())
.boxed()
.collect(toMap(i->i,i->sorted.get(i).getName());

这将创建一个从0到列表大小的
int
流,并将每个值收集到一个映射中。

由于您希望将元素收集到一个数据结构中,该数据结构本质上跟踪作为其大小的位置,您可以使用自定义收集器执行该操作:

Map<Integer, String> map=sorted.stream()
    .map(x -> x.getName())
    .collect(HashMap::new, (m,s) -> m.put(m.size(), s),
        (a,b) -> { int off=a.size(); b.forEach((i,s) -> a.put(i+off, s));});
Map Map=sorted.stream()
.map(x->x.getName())
.collect(HashMap::new,(m,s)->m.put(m.size(),s),
(a,b)->{int off=a.size();b.forEach((i,s)->a.put(i+off,s));};

最棘手的部分是merge函数,它将仅用于并行处理。它将一个映射的所有元素添加到其前一个映射中,但必须按前一个元素的数量偏移键。

谢谢你的回答,但我希望得到更像sorted.stream()的东西。blah(…)你不能将一个列表及其索引流式化,不幸的是,请参见:@dinesh707,
EntryStream.of(sorted.mapValues->s.getName()).toMap()
如果确实不想考虑索引,请使用。一般来说,Tunaki溶液是好的。