我所做的工作如下:
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,等等。
谢谢
发布于 2020-02-17 08:44:29
另一个选项是在谓词中执行空检查:
.filter(o -> source.equals(o.getSource())
&& (null == date || date.equals(o.getDate()))
&& (null == id || id.equals(o.getId())))发布于 2020-02-17 08:28:54
您可以使用静态方法Objects::equals。此方法很可能就是为此而设计的:
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:
.filter(o -> Objects.nonNull(o.getId()) && Objects.nonNull(o.getDate()))更新
如果您想跳过getDate()的比较如果date是null (对于id也一样),那么您可以先检查null,就像在K的回答中一样。
您可以很容易地为它构建一个小方法:
public static boolean nullOrEquals(Object baseObject, Object compareObject) {
return baseObject == null || Objects.equals(baseObject, compareObject);
}.filter(o -> Objects.equals(source, o.getSource())
&& nullOrEquals(date, o.getDate())
&& nullOrEquals(id, o.getId()))https://stackoverflow.com/questions/60258360
复制相似问题