使用Java8流比较两个列表相同位置的元素

使用Java8流比较两个列表相同位置的元素,java,list,java-stream,Java,List,Java Stream,我有两个列表,我想比较列表1和列表2的每个元素,并在列表3中得到结果,例如 List1 = {99,22,33} list2 = {11,24,33} 结果: list3 = {1,-1,0} 如何更好地使用stream实现这一点?像这样尝试: 这将用比较结果替换用于索引每个列表的int流。然后把它们收集到一个列表中 注意:我添加了一个保护措施来解释不同大小的列表。它将使用两者中较小的一个来防止抛出异常。但较长列表的尾随元素将被忽略 List<Integer> list1 =

我有两个列表,我想比较列表1和列表2的每个元素,并在列表3中得到结果,例如

List1 = {99,22,33}

list2 = {11,24,33}
结果:

list3 = {1,-1,0}
如何更好地使用stream实现这一点?

像这样尝试:

这将用比较结果替换用于索引每个列表的
int
流。然后把它们收集到一个列表中

注意:我添加了一个保护措施来解释不同大小的列表。它将使用两者中较小的一个来防止抛出异常。但较长列表的尾随元素将被忽略

List<Integer> list1 = List.of(99, 22, 33);
List<Integer> list2 = List.of(11, 24, 33);

// safeguard against different sized lists.
int minLen = Math.min(list1.size(), list2.size());
List<Integer> result = IntStream.range(0, minLen)
        .map(i -> list1.get(i).compareTo(list2.get(i)))
        .boxed().collect(Collectors.toList());

System.out.println(result);

是否保证列表的大小相同?如果不是,您希望如何处理这种情况?很好的解决方案,但正如@Pshemo所说,只有当两个列表的大小相同时,它才会起作用。如果列表2的成员较少,则会引发运行时异常。无论如何,OP提到了Java8,所以
List.of
是Java9的一部分,因此我将它改为
Arrays.asList
:)是的。我修改了我的答案,并使用Math.min()获得最小长度以避免出现异常。这取决于OP是否需要。是的,两个列表大小相同。感谢您提供的解决方案,这将适用于我@wjs或使用
mapToObj
而不是
map…boxed
combination@WJS真奇怪。最近的一次调查收集了反馈意见,我在调查中也提出了类似的意见。我相信这个网站在某种程度上缺乏对“富人不再变富”的克制。(不过,这里没有进一步讨论)
[1, -1, 0]