【问题标题】:Comparing elements at same position of two list using Java 8 stream使用Java 8流比较两个列表相同位置的元素
【发布时间】:2020-04-04 21:17:24
【问题描述】:

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

List1 = {99,22,33}

list2 = {11,24,33}

结果:

list3 = {1,-1,0}

我怎样才能最好地使用流来做到这一点?

【问题讨论】:

  • 列表是否保证大小相同?如果不是,您希望如何处理这种情况?

标签: java list java-stream


【解决方案1】:

试试这样:

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

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

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);

打印

[1, -1, 0]

【讨论】:

  • 不错的解决方案,但正如@Pshemo 所说,它仅在两个列表具有相同大小时才有效。如果 list2 的成员较少,则会引发运行时异常。无论如何,OP 提到了 Java 8,所以 List.of 是 Java 9 的一部分,因此我将其更改为 Arrays.asList :)
  • 是的。我修改了我的答案并使用 Math.min() 来获得最小长度以避免异常。是否需要由 OP 决定。
  • 是的,两个列表的大小相同。感谢您的解决方案,这对我有用@WJS
  • 或使用mapToObj 代替map...boxed 组合
  • @WJS 确实很奇怪。最近的一项调查收集了反馈,类似的 cmets 被我标记了。我相信该网站在某种程度上缺乏避免“富人变得更富有”。 (这里没有进一步讨论)
猜你喜欢
  • 2018-05-30
  • 2020-08-13
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多