java-8 - Java 流的两个 List<int[]> 类型的交集

标签 java-8 java-stream

List<int[]> bigList = new ArrayList<int[]>();
List<int[]> smallList = new ArrayList<int[]>();

我需要生成一个 int[] 类型的列表,其中公共(public)数组构成两个列表。(值应该相等,不使用 contains())

如何在 java 流中高效地做到这一点??

最佳答案

如果它真的必须是一个流解决方案,这里有一个:

List<int[]> intersection=bigList.stream().map(IntBuffer::wrap)
    .filter(b->smallList.stream().map(IntBuffer::wrap).anyMatch(b::equals))
    .map(IntBuffer::array)
    .collect(Collectors.toList());

但是通过执行高达 bigList.size()×smallList.size() 的操作,它并不是真正有效的。因此,强烈建议使用中间 Set 存储,而不是即时执行所有操作:

Set<IntBuffer> bigSet=bigList.stream().map(IntBuffer::wrap).collect(Collectors.toSet());
List<int[]> intersection=smallList.stream().map(IntBuffer::wrap)
     .filter(bigSet::contains).map(IntBuffer::array).collect(Collectors.toList());

请注意,您不应将 List 用于集合操作。源和结果排序的语义以及如何处理源列表中的重复项未指定。

关于java-8 - Java 流的两个 List<int[]> 类型的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31451891/

相关文章:

java - 单行类实例实现

collections - 将 Map <Integer, Long> 转换为整数数组

java - 沿元素将列表拆分为子列表

Java 8 : Supplier working with files throws "stream has already been operated upon or closed"

java - 错误 : incompatible types: unexpected return value : Java 8

java - Cordova 和 JDK 相互矛盾 : Requirements check failed for JDK 1. 8 或更大

java - 在正文中忽略参数时编写 lambda 表达式

Java 8 流并行度 : set number of threads to use?

java - 在流过滤器中包含 IgnoreCase 来计算字符串列表中某个特定单词的出现次数

java - 使用 Java Stream API 获取大写字符作为字符串