假设我有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
对象的列表,而不仅仅是布尔布尔值。
答案 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());