【问题标题】:Java 8 streams how to filter contents a List not found in another arrayList?Java 8流如何过滤在另一个arrayList中找不到的List的内容?
【发布时间】:2026-02-03 01:15:01
【问题描述】:

我可以根据在 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){

}

【问题讨论】:

标签: java java-8


【解决方案1】:

您可以使用filter API in java 8 Stream 来执行此操作。像下面的代码sn -p:

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @author Shizhz
 */
public class Main {
    private static Set<String> _IDsFromFile;
    private static Set<String> _IDsFromImage;

    static {
        _IDsFromFile = new HashSet();
        _IDsFromFile.add("00123");
        _IDsFromFile.add("003456");
        _IDsFromFile.add("023299");
        _IDsFromFile.add("023300");

        _IDsFromImage = new HashSet<>();
        _IDsFromImage.add("00123.jpeg");
        _IDsFromImage.add("003456.jpeg");
        _IDsFromImage.add("023299.jpeg");
    }

    private static Set<String> filterEmployeesWithPhones(Set<String> employeeSet, Set<String> photoSet) {
        return employeeSet.stream().filter(empId -> photoSet.contains(empId + ".jpeg")).collect(Collectors.toSet());
    }

    public static void main(String[] args) {
        filterEmployeesWithPhones(_IDsFromFile, _IDsFromImage).forEach(emp -> System.out.println(emp));
    }
}

会给你结果:

00123

003456

023299

【讨论】:

  • 这或多或少是正确的,但由于列表确定元素成员资格需要 O(n) 时间,因此性能不佳。如果您可以改用Sets,那就太棒了。
  • @Makoto,是的,你是对的,更新了我的代码 sn-p。在这种情况下,我认为Set 对于employeephone 集合都可以。谢谢你的建议:-)
  • 谢谢你,这是一个很好的解决方案。雅集将表现良好。尤其是有大量员工
【解决方案2】:

首先,您应该将这些列表中的一个或另一个转换为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)。

【讨论】:

    最近更新 更多