我需要一个方法,它通过检查元素的字段是否包含在另一个集合的元素字段中来筛选出一个集合。哪种方式更好:
一个方法,返回已过滤的集合:
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));
}发布于 2019-09-12 13:00:01
第一种方法更好。现实生活中的外参数概念很难维护。
发布于 2019-09-12 13:19:03
您的method1 & method2不会像您预期的那样工作,因为它在foo上的最后一个流中没有终端操作。建议尽可能使用不可变的方法,因为这样可以减少错误发生的代码,并且易于理解代码行为。你应该看看这件事
List method1(List foo, List bar){
if (bar.isEmpty())
return Collections.emptyList();
final Set<Integer> barIds = getIds(bar);
return foo.stream()
.filter(elem->barIds.contains(elem.barId))
.collect(Collectors.toList());
}
private Set<Integer> getIds(final List bar) {
return bar.stream()
.map(elem->elem.getId)
.collect(Collectors.toSet());
}发布于 2019-09-11 10:05:23
返回不同版本的输入的方法不是修改它,而是通过值传递输入的方法,这是一种符合Java设计方式的策略。另一种是通过引用传递输入的方法,即C的工作方式。正如您刚才所证明的,在Java中也可以这样做,但它更多地是一种“解决办法”,而不是一种特性。https://www.mathwarehouse.com/programming/passing-by-value-vs-by-reference-visual-explanation.php#targetText=The%20terms%20%22pass%20by%20value,where%20the%20value%20is%20stored.
不是说哪个版本更好,但如果有疑问,我会使用第一个版本。
希望我帮了你。
https://stackoverflow.com/questions/57885833
复制相似问题