java-stream,map,与对象

时间:2018-02-06 23:34:45

标签: java java-stream

所以我有一个insIds的整数列表,从中我可以获得一个ABC列表,我想将它们映射到map中的一个条目(注意我们不能从Abc.getIns获取IIdId)

这就是我想要的:(但是因为我们有getInsId我们无法以这种方式编写)

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

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

已知整数列表:insIds

将采用insIds和返回列表的已知函数:

abcController.findAbcsByInsIds(insIds)

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

(期望输出:Map<Integer, Integer> insIdToAbcId

3 个答案:

答案 0 :(得分:4)

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

findAbcsByInsIds()

答案 1 :(得分:1)

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

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

这样做:

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已预先分配到适当的大小,因此可以消除调整大小,从而无需重新进行重新整理,即提高性能。

答案 2 :(得分:0)

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方法,可以使用不受支持的异常来确保它永远不会被调用,如果下划线jre的实现细节发生变化,它就不会在没有人知情的情况下发生变化。