JAVA 8 - Stream()功能,无法通过添加多个过滤器来打印值

Kar*_*yan 2 java filtering java-8 java-stream

我试图从.stream()via 2 打印值.filter().但价值不是印刷.

一个人.filter()能够打印值.
请在下面找到我的代码.

listProducts.stream()
        .flatMap(listproducts -> listproducts.getProductAttr().stream())
        .flatMap(attr ->attr.getProductAttrValue().stream())
        .filter(av ->  av.getLabel().equalsIgnoreCase("source"))
        .filter(av -> av.getLabel().equalsIgnoreCase("description"))
        .forEachOrdered(av -> System.out.println(av.getValue()));
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 11

没有任何元素Stream可以Predicate传递给你的两个filter调用传递,因为av.getLabel()不能同时同时"源"和"描述".

您可以使用单个过滤器:

.filter(av -> av.getLabel().equalsIgnoreCase("source") || 
              av.getLabel().equalsIgnoreCase("description"))
Run Code Online (Sandbox Code Playgroud)


And*_*lko 5

.filter(av -> Pattern.matches("(?i)source|description", av.getLabel()))
Run Code Online (Sandbox Code Playgroud)

"source"在第一次过滤后,您只保留字符串(忽略大小写).
第二个filter开始了之前的结果.
您应该在一个内部构建一个复合布尔表达式filter.
我建议写那个简单的正则表达式.*

*可以通过预编译模式来改进@ daniu的建议.

  • 因为这本质上是一个循环,我建议预编译模式,即`Pattern pattern = Pattern.compile("(?i)source | description")`和`.filter(av - > pattern.matcher(av. getLabel()).匹配()`. (4认同)
  • 如果没有预编译,你可以使用更简单的`.filter(av - > av.getLabel().matches("(?i)source | description"))`. (2认同)