【问题标题】:Java Stream_Don't apply filter if my filter string is nullJava Stream_Don't apply filter if my filter string is null
【发布时间】:2019-11-25 16:04:51
【问题描述】:

我有 3 个过滤器,但它们并不总是充满值!

例如:

a=1, b=2, c=null

我有这个用于过滤:

myList.stream()
      .filter(item->item.a == a)
      .filter(item->item.b == b)
      .filter(item->item.c == c)
      .Collect(collection.asList);

但这对我不起作用。如果我对c 的输入是null,我需要忽略c 参数及其过滤器,如下所示:

 myList.stream()
       .filter(item->item.a == a)
       .filter(item->item.b == b)
       .Collect(collection.asList);

每当其他过滤器为null 时,都应将其从过滤器链中删除,如上例中的c

【问题讨论】:

  • item.c 和输入c 声明的数据类型是什么?
  • 因此更改谓词的实现,以便在 c 为 null 时始终返回 true。并且,当您提出问题时,请发布真实代码。不是伪代码。
  • 那么.filter(item -> item.c == null || item.c == c)?
  • 提前感谢@ernest_k。这是字符串
  • 谢谢@Holger,我认为这与我的问题相反,问题是空输入!不是对象的 null 属性

标签: java filter java-8 java-stream


【解决方案1】:

要使条件生效,它需要常量为null 或项的值等于常量。这看起来像:

myList.stream()
      .filter(item -> a == null || item.a == a)
      .filter(item -> b == null || item.b == b)
      .filter(item -> c == null || item.c == c)
      .collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    我的版本:

    myList.stream()
            .filter(item -> a == null ? true : item.a.equals(a))
            .filter(item -> b == null ? true : item.b.equals(b))
            .filter(item -> c == null ? true : item.c.equals(c))
            .collect(Collectors.toList());
    

    当过滤器方法返回 true 时,它​​不会过滤掉任何东西。如果abc 是引用,则通常应使用equals() 进行比较,而不是==

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2020-04-22
      • 2016-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多