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

java流、地图、与对象无关的键

万高畅
2023-03-14

所以我有一个整数的列表,它是内部的,从这里我可以得到一个Abc的列表,我想把它们映射到map中的一个条目(注意,我们不能从Abc.getIns中获取内部)

这就是我想要的:(但由于我们没有GetInsin,我们不能这样写)

Map<Integer, Integer> insIdToAbcId = abcController
          .findAbcsByInsIds(insIds)
          .stream()
          .collect(Collectors.toMap(Abc::getInsId,
            Abc::getAbcId));

我不知道如何编写它,以获得我想要的映射关系。

已知整数列表:内部

将获取insIds并返回列表的已知函数:

abcController.findAbcsByInsIds(insIds)

然后是我不确定的:如何将insin映射到AbcId

(预期输出:Map


共有3个答案

周阳波
2023-03-14
Map< Integer, Integer > insIdToAbcId = findAbcsByInsIds( insIds )
            .stream( )
            .collect( HashMap::new, ( map, abc ) -> map.put( insIds.get( map.size( ) ), abc.getAbcId( ) ), ( a, b ) -> {} );

对于每个版本,都要解决关于第三个参数的合同问题

    Map< Integer, Integer > map = new HashMap<>(  );
    findAbcsByInsIds( insIds )
            .forEach( (abc) -> map.put( insIds.get( map.size( ) ), abc.getAbcId( ) ));

这实际上更简单,不需要装箱,甚至不需要收集器的辅助流。但是关于collect方法,可以使用一个不受支持的异常来确保它从未被调用,如果underline jre的实现细节发生变化,那么在不知情的情况下它不会发生变化。

傅毅然
2023-03-14

这是Stream不是正确解决方案的问题的一个主要示例。

在调用findabcsbyinds()之后,您有两个大小相等的列表,并且您希望按位置匹配它们,即需要并行迭代它们。

这样做:

List<Integer> insIds = /*...*/
List<Abc> abcList = abcController.findAbcsByInsIds(insIds);

Map<Integer, Integer> insIdToAbcId = new HashMap<>(insIds.size() * 4 / 3 + 1);
Iterator<Integer> insIter = insIds.iterator();
Iterator<Abc> abcIter = abcList.iterator();
while (insIter.hasNext())
    insIdToAbcId.put(insIter.next(), abcIter.next().getAbcId());

即使列表是LinkedList,此代码也会运行良好
HashMap已预先分配到适当的大小,因此消除了大小调整,从而避免了重新灰化的需要,即为了更好的性能。

祁鸿晖
2023-03-14

如果insIds中的项目与findAbcsByInsIds()的结果之间存在有序的一对一关系,则可以按索引加入列表:

List<Abc> abcs = abcController.findAbcsByInsIds(insIds);
Map<Integer, Integer> insIdToAbcId = IntStream.range(0, insIds.size())
        .boxed()
        .collect(Collectors.toMap(insIds::get, i -> abcs.get(i).getAbcId()));
 类似资料:
  • 问题内容: 我刚刚发现了chromestatus.com,在失去了一天的时间后,发现了以下功能条目: 映射:映射对象是简单的键/值映射。 那让我感到困惑。常规JavaScript对象是字典,那么它与字典有何不同?从概念上讲,它们是相同的(根据 Map和Dictionary之间的区别是什么?) chromestatus文档参考也无济于事: 映射对象是键/值对的集合,其中键和值都可以是任意ECMASc

  • 问题内容: 我想展平一个将键关联到的列表的a ,而不会丢失键映射。我很好奇,就好像它是可能的,与这样做有用的和。 我们从这样的东西开始: 假设mapFrom填充在某处,如下所示: 我们还假设列表中的值是唯一的。 现在,我想“展开”它以获得第二张地图,例如: 我可以这样做(或使用,非常类似): 现在,假设我要使用lambda而不是嵌套循环。我可能会做这样的事情: 我也尝试了,但是我不认为这是正确的方

  • 问题内容: 我正在自学Java,这本书中的其中一项复习练习要求“对象”和“对象变量”之间的区别。 我知道什么是对象(类的特定实例),但是我似乎无法在书中的任何地方(无答案部分)或在互联网上找到术语“对象变量”。 有人知道这个名词的意思吗? 问题答案: 它是“实例变量”的同义词: 显然,该术语并不常用,最好坚持使用“实例变量”以避免任何潜在的歧义。

  • 问题内容: 我怎么能展平的(同类型)s到一个用Java 8? 问题答案: 我的语法可能有些偏离,但是flatMap应该为您完成大部分工作:

  • 假设我有一个实现下面接口的对象列表: 假设我也有一个类,它能够对这些对象进行求和: 我在玩一个自定义收集器,但无法找到一些整洁的解决方案。

  • 问题内容: 我想将两个Map与JAVA 8 Stream合并: 我尝试使用此实现: 但是,此实现只会产生如下结果: 如果中没有包含一个键,则会将其作为新键添加到相应的String列表中。如果键在和中重复,则两个值列表将被合并为:,然后是。 问题答案: 您可以通过遍历中的所有条目并将它们合并到中来实现此目的。 下面通过调用操作消耗每个条目的键和值的位置来遍历的条目。对于每个条目,我们叫上:这将要么创