当前位置: 首页 > 知识库问答 >
问题:

从单个列表并行输入映射和列表

韦原
2023-03-14
List<Model> models = ....
List<String> anotherlist = models.parallelStream().map(Model::getName).collect(Collectors.toList());
Map<String, Model> modelsMap = new ConcurrentHashMap<String, Model>();
for (final Model model : models) {
   modelsMap.put(model.getId(), model);
}

共有1个答案

黎腾
2023-03-14

看来你想要的只是:

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

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

注意,这将抛出一个异常是重复ID的情况。

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()]));
}
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;
    }
}
 类似资料:
  • 我和mappstruct一起工作,我有一个问题,我不知道mapstruct是否能帮上忙。问题是我有一个DATA类。 和地址 和“人” @Mapper公共接口DataToPerson { }

  • 的默认行为 mapper() 在映射的 Table 到映射的对象属性中,每个属性都根据列本身的名称命名(特别是 key 属性 Column )这种行为可以通过几种方式进行修改。 从属性名称清楚地命名列 默认情况下,映射与 Column 与映射属性的相同-具体来说,它与 Column.key 属性对 Column ,默认与 Column.name . 指定给映射到的python属性的名称 Colum

  • 使用Java8 lambdas,在给定可能键的和的情况下,有效创建新的的“最佳”方法是什么?在这种情况下,您将得到一个包含可能的键的并希望生成一个其中是基于的某个方面构造的某种类型,即映射值类型。 我已经研究了几种方法,但认为一种方法比另一种方法更好(可能有一个例外--参见代码)。我将把“最佳”解释为代码清晰度和运行时效率的结合。这些是我想出来的。我肯定有人能做得更好,这是这个问题的一个方面。我不

  • 以下各节讨论如何将表列和SQL表达式映射到各个对象属性。 映射表列 从属性名称清楚地命名列 从反射表自动化列命名方案 用前缀命名所有列 对列级别选项使用列属性 映射表列的子集 作为映射属性的SQL表达式 使用杂交种 使用列属性 在映射时从列属性合成 使用普通描述符 作为映射属性的查询时间SQL表达式 更改属性行为 简单验证器 在核心级别使用自定义数据类型 使用描述符和混合 同义词 操作员自定义 组

  • 我有一个a类和B类的列表,没有重复的元素。“代码”属性在A类和B类中都是相同的。我想将它们转换为Map 最终映射的顺序应与列表1中的元素相同 ~A 更新:我将代码更新到下面,但它不是编译的。你知道怎么了吗?

  • 我有两份清单: 列表1: Object1(name1, id1) 列表2: Object2(name2, id2) 给定list1的大小与list2相同 我想迭代list2,如果list2的name2不为null,则更新list1的name1。 以下是使用旧java的代码: 用java实现这一点的最佳方法是什么。util。流动