【发布时间】:2023-03-04 03:26:01
【问题描述】:
我有以下 sn-p 收集具有 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,并以比在过滤器中使用条件块更好的方式检查空属性或空属性。
【问题讨论】:
-
我很困惑。您已决定
Objects::nonNull需要是一个单独的过滤器,但其他所有内容都需要放在一个单独的过滤器中。为什么会这样? -
@zeroflagL 这样做是为了便于阅读, Objects:nonNull 在对象级别工作,其中第二个过滤器作用于对象本身的属性。我不知道从性能的角度来看这是否有任何影响,但为了便于阅读,我认为它很有用。
-
这就是我的观点:如果您力求可读性,那么为什么要使用复杂的第二个过滤器,而不是像
Foo::hasName这样的单独且可能可重复使用的过滤器? -
我对 java8 很陌生,我的直觉是自定义过滤器需要在我的模型中进行一些实现,对吧?在这种情况下,这是唯一使用过滤的地方,因此我的问题是:如果只使用一次自定义过滤器是否有意义?如果是的话,我想举一个例子来说明它是如何实现的。有人可能会觉得它很有用。
标签: java filter java-8 java-stream