Java 8 流如何过滤在另一个 arrayList 中找不到的列表的内容?

标签 java java-8

我可以根据在 Java 8 中的另一个数组列表中找到的元素来过滤数组列表吗?整个故事是我从 oracle 电子商务套件应用程序中获取了活跃员工的列表

**EmpID**
00123
003456
023299  

我有一个单独的文件,其中包含文件名为 EmpID.jpeg

的照片
**FileName**
00123.jpeg
003456.jpeg
023299.jpeg         

现在我的目的是比较列表并过滤向我提供照片和未提供照片的员工。

private ArrayList<String> _IDsFromFile;
private ArrayList<String> _IDsFromImage;

      ---
      ---

public void compareAndCopy(String fileName){

}

最佳答案

首先,您应该将这些列表中的一个或另一个转换为 Set ,所以 .contains()检查是有效的。在 List 上调用 .contains() 是线性时间操作,这意味着这样做 n 次是二次的。

一旦完成,就可以直接使用 .filter()甚至 .partitioningBy()以确定两个列表重叠的位置。

Set<String> imageIdsSet = new HashSet<>(IDsFromImage);

List<String> overlappingIds = IDsFromFile.stream()
    .filter(imageIdsSet::contains)
    .collect(toList());

// OR

Map<Boolean, List<String>> partitionedIds = IDsFromFile.stream()
    .collect(partitioningBy(imageIdsSet::contains));
List<String> overlappingIds = partitionedIds.get(true);
List<String> missingIds = partitionedIds.get(false);

原则上,您所描述的是 set operations . “重叠”ID 是两组 ID 的交集,而“缺失”ID 是差异

Guava在其 Sets 中提供了这些操作的有效实现效用。 ( unionintersectiondifferencecomplementOf )。

关于Java 8 流如何过滤在另一个 arrayList 中找不到的列表的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42730691/

相关文章:

java - 如何使用 Java 获取计算机特定的 ID 号

Java - repaint() 方法被调用一次,然后它不显示任何内容

java - 使用 XPath 将 XML 信息提取到 List<Map>

java - 将 GMT 中的 XMLGregorianCalendar 转换为 LocalDateTime 太平洋时间

java - 使用 Java 8 中断/停止 forEachRemaining

java - 集合排序(空列表()): cannot infer type-variable

Gradle 中的 Java 8 构建错误

java - 当使用带有 varargs 参数的构造函数时,如何强制至少必须传递一个参数?

java - 在什么情况下箭头键不会遍历组合框?

java - 为什么Java的sort实现在排序之前先将列表转换为数组?