获取与Java Streams不在同一列表中的结果列表

时间:2018-12-08 04:44:16

标签: java java-stream

假设我有ToFilter个对象的列表,如下所示:

private class ToFilter {
    String option1;
    String option2;
}

使用Java流,我想过滤掉所有其他对象的选项2中不包含选项1的所有元素。例如,如果有4个ToFilter实例,则:

option1 = C,
option2 = A

option1 = C,
option2 = F

option1 = A,
option2 = B

option1 = A,
option2 = D

C应该被过滤并包含在结果集中,因为它在option1中有条目,但在任何其他对象的option2中都没有条目。类似nonematch()的东西,但是实际上返回的是ToFilter对象的列表,而不仅仅是布尔布尔值。

2 个答案:

答案 0 :(得分:3)

我将使用两个流,创建所有option2值的集合,并根据它们检查集合中的option1值:

List<ToFilter> list = ...;

Set<String> option2Set = list.stream()
        .map(ToFilter::getOption2)
        .collect(Collectors.toSet());

List<ToFilter> filtered = list.stream()
        .filter(f -> !option2Set.contains(f.getOption1()))
        .collect(Collectors.toList());

答案 1 :(得分:1)

您可以在此处使用Stream.noneMatch作为

List<ToFilter> finalResult = filterList.stream()
        .filter(a -> filterList.stream() // use filter if same object could have option 1 and 2 equal
                .noneMatch(toFilter -> a.getOption1().equals(toFilter.getOption2()))) 
        .collect(Collectors.toList());