我有以下代码段,用于收集具有name
字符串属性且包含特定过滤器filterName
的特定对象。
List<Foo> filteredFoo= fooList.stream()
.filter(Objects::nonNull)
.filter(myFoo -> {
if (Strings.isNullOrEmpty(myFoo.getName()))
return false;
return myFoo.getName().contains(filterName);
}
).collect(Collectors.toList());
它按预期工作但我想知道是否有更优雅的方式以函数方式编写if-statement
并以比在过滤器中具有条件块更好的方式检查空或null属性。
答案 0 :(得分:7)
将第二个filter
替换为以下内容:
.filter(myFoo -> Optional.ofNullable(myFoo.getName())
.filter(n -> n.contains(filterName))
.isPresent())
甚至:
.filter(myFoo -> {
String name = myFoo.getName();
return name != null && name.contains(filterName)
})
答案 1 :(得分:1)
为结果表达式找到函数样式:
.filter(foo -> foo.getName() != null && foo.getName().contains(filterName))
拆分不会带来更多简单:
.filter(foo -> foo.getName() != null)
.filter(foo -> foo.getName().contains(filterName))
在Foo :: getName(Objects :: isNull)上使用谓词也是无意义的复杂,只是为了备用变量。
如果filterName本身不为空,则不需要Strings.isEmptyOrNull。
答案 2 :(得分:0)
如果您有权访问Foo Class,请将if条件移至方法isSameName
并使用过滤器,如下所示
filter(myFoo -> {return myFoo.isSameName(filterName);})