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

时间:2017-03-11 02:37:29

标签: 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){

}

2 个答案:

答案 0 :(得分:10)

首先,您应该将这些列表中的一个或另一个转换为Set,以便.contains()检查有效。在.contains()上调用List是线性时间操作,这意味着这样做 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。 &#34;重叠&#34; ID是两组ID的交集,而&#34;缺少&#34; ID是差异

GuavaSets实用程序中提供了这些操作的高效实现。 (unionintersectiondifferencecomplementOf)。

答案 1 :(得分:5)

您可以使用filter API in java 8 Stream来执行此操作。如下面的代码片段:

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