首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不将筛选代码包装在'if‘条件下过滤数据,以检查筛选键上的null?

问如何在不将筛选代码包装在'if‘条件下过滤数据,以检查筛选键上的null?
EN

Stack Overflow用户
提问于 2020-02-17 08:20:35
回答 2查看 549关注 0票数 1

我所做的工作如下:

代码语言:javascript
复制
List<Objects> filtered = objects.stream()
    .filter(o -> source.equals(o.getSource()) && date.equals(o.getDate()) && id.equals(o.getId()))
    .collect(Collectors.toList());

其中date和id都可能是null,因为它们都来自方法参数。

如果为null,我如何忽略它们,而不将上面的代码包装在if语句tp中,检查空值的'id‘和'date’?我想在过滤器里面做。

编辑:为了更清楚,我希望过滤器只对非空值起作用,也就是说,如果日期为非空且id为空,则只在日期上过滤,忽略id,等等。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-17 08:44:29

另一个选项是在谓词中执行空检查:

代码语言:javascript
复制
.filter(o -> source.equals(o.getSource()) 
             && (null == date || date.equals(o.getDate()))
             && (null == id || id.equals(o.getId())))
票数 2
EN

Stack Overflow用户

发布于 2020-02-17 08:28:54

您可以使用静态方法Objects::equals。此方法很可能就是为此而设计的:

代码语言:javascript
复制
List<Objects> filtered = objects.stream()
    .filter(o -> Objects.equals(source, o.getSource()) && Objects.equals(date, o.getDate()) && Objects.equals(id, o.getId()))
    .collect(Collectors.toList());

注意:正如Scratte在注释中提到的那样,如果getDate()也是null,这可能不会过滤出date返回date的对象。id也是如此。如果是这样的话,那么上面的代码片段就不符合了。在这种情况下,我们必须显式地筛选非空日期和In:

代码语言:javascript
复制
.filter(o -> Objects.nonNull(o.getId()) && Objects.nonNull(o.getDate()))

更新

如果您想跳过getDate()的比较如果date是null (对于id也一样),那么您可以先检查null,就像在K的回答中一样。

您可以很容易地为它构建一个小方法:

代码语言:javascript
复制
public static boolean nullOrEquals(Object baseObject, Object compareObject) {
    return baseObject == null || Objects.equals(baseObject, compareObject);
}
代码语言:javascript
复制
.filter(o -> Objects.equals(source, o.getSource())
    && nullOrEquals(date, o.getDate())
    && nullOrEquals(id, o.getId()))

下面是一个Ideone的例子。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60258360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档