如何使用流

时间:2015-11-19 14:16:34

标签: java java-8 java-stream

我有一个对象列表。我想做以下

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

在Java 8流API中有没有直接的方法呢?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

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

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

答案 1 :(得分:2)

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

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));});

最棘手的部分是合并功能,它仅用于并行处理。它将地图的所有元素添加到其前一个地图中,但必须通过前面元素的数量来抵消键。