所以我有一个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
)
答案 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的实现细节发生变化,它就不会在没有人知情的情况下发生变化。