【发布时间】:2020-11-06 16:48:14
【问题描述】:
我需要一个方法,通过检查元素的字段是否包含在另一个集合的元素字段中来过滤出集合。哪种方式更好:
一个方法,返回过滤后的集合:
List method1(List foo, List bar){
if(bar.isEmpty())
return Collections.emptyList();
Set<Integer> ids = bar.stream().map(elem->elem.getId).collect(Collectors.toSet());
return foo.stream().filter(elem->ids.contains(elem.barId));
}
- 轻松处理空条件集合
- 创建流和另一个集合
或者一个方法,修改原来的集合:
void method2(List foo, List bar){
if(bar.isEmpty()){
foo.clear();
return;
}
Set<Integer> ids = bar.stream().map(elem->elem.getId).collect(Collectors.toSet());
foo.removeIf(elem->ids.contains(elem.barId));
}
- 没有多余的对象
- 清除原始集合而不是仅返回新集合
【问题讨论】:
-
请粘贴至少可以编译的代码。你的,没有。至少第一个是多个问题。那么第二个不是更好。
-
这取决于你是否还需要原来的
List,因为removeIf修改了它。就个人而言,我总是使用过滤后的Stream,因为通常您不知道该列表还引用了哪些其他地方。 -
使用流加倍列表 嗯?那不是真的。流的全部意义在于它们在集合上呈现视图。没有“加倍”
-
我认为可能在这些文本片段和不可编译的代码中隐藏着一个值得投票的问题......
-
顺便说一句:这个boolean retainAll(Collection<?> c) 已经有特殊的方法,以防您的两个列表具有相同类型的对象并且equals 行为正确。
标签: java java-8 java-stream