gpt4 book ai didi

java - 从单个列表并行输入 map 和列表

转载 作者:搜寻专家 更新时间:2023-11-01 02:23:04 24 4
gpt4 key购买 nike

我有如下列表。

List<Model> models = ....

到现在为止,我都是这样做的

List<String> anotherlist = models.parallelStream().map(Model::getName).collect(Collectors.toList());

现在,我创建了另一个 map

Map<String, Model> modelsMap = new ConcurrentHashMap<String, Model>();
for (final Model model : models) {
modelsMap.put(model.getId(), model);
}

当我在 models 列表上创建 do parallel stream 时,我是否可以并排准备我的 modelsMap 而不必遍历 models再次列出?并行流是否只绑定(bind)一种操作?

最佳答案

看来你想要的只是:

ConcurrentMap<String, Model> modelsMap = 
models.parallelStream()
.collect(toConcurrentMap(Model::getId, identity()));

这通过使用 Collectors.toConcurrentMap 收集模型列表从模型列表中创建一个 ConcurrentMap .键映射器是返回模型名称的函数,值映射器是标识函数。

请注意,如果 ID 重复,这将引发异常。

如果你想在同一个流管道中创建名称列表和这个 map ,你可以使用 pairing收集器写在这个答案中,并将结果保存在自定义 Pair 类中。 map 将是该对的第一个元素,名称列表将是第二个。

Pair<Map<String, Model>, List<String>> pair = 
models.parallelStream()
.collect(pairing(
toConcurrentMap(Model::getId, identity()),
mapping(Model::getName, toList()),
Pair::new)
);

static <T, A1, A2, R1, R2, R> Collector<T, ?, R> pairing(Collector<T, A1, R1> c1,
Collector<T, A2, R2> c2, BiFunction<R1, R2, R> finisher) {
EnumSet<Characteristics> c = EnumSet.noneOf(Characteristics.class);
c.addAll(c1.characteristics());
c.retainAll(c2.characteristics());
c.remove(Characteristics.IDENTITY_FINISH);
return Collector.of(() -> new Object[] {c1.supplier().get(), c2.supplier().get()},
(acc, v) -> {
c1.accumulator().accept((A1)acc[0], v);
c2.accumulator().accept((A2)acc[1], v);
},
(acc1, acc2) -> {
acc1[0] = c1.combiner().apply((A1)acc1[0], (A1)acc2[0]);
acc1[1] = c2.combiner().apply((A2)acc1[1], (A2)acc2[1]);
return acc1;
},
acc -> {
R1 r1 = c1.finisher().apply((A1)acc[0]);
R2 r2 = c2.finisher().apply((A2)acc[1]);
return finisher.apply(r1, r2);
}, c.toArray(new Characteristics[c.size()]));
}

使用以下 Pair 类:

public class Pair<T, U> {
private final T first;
private final U second;

public Pair(T first, U second) {
this.first = first;
this.second = second;
}

public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}

关于java - 从单个列表并行输入 map 和列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com