Java 8 Stream多过滤条件无法打印值问题求助
问题分析与解决
嘿,我一眼就瞅出问题所在啦!你代码里的两个连续filter()其实是在做**逻辑与(AND)**的判断——一个元素必须同时满足「label等于source」和「label等于description」才能通过过滤,但显然一个ProductAttrValue对象的label不可能同时是这两个值呀!这就导致所有元素都被第二个filter给筛掉了,自然啥输出都没有。
而你用单个filter()的时候,只需要满足其中一个条件就能保留元素,所以能正常打印结果。
解决方案
你只需要把两个过滤条件合并成一个,用**逻辑或(OR)**来连接就行,有两种写法:
写法1:直接在单个filter里用||
listProducts.stream() .flatMap(listproducts -> listproducts.getProductAttr().stream()) .flatMap(attr -> attr.getProductAttrValue().stream()) .filter(av -> av.getLabel().equalsIgnoreCase("source") || av.getLabel().equalsIgnoreCase("description")) .forEachOrdered(av -> System.out.println(av.getValue()));
写法2:用Predicate.or()组合条件(更优雅)
Predicate<ProductAttrValue> isSource = av -> av.getLabel().equalsIgnoreCase("source"); Predicate<ProductAttrValue> isDescription = av -> av.getLabel().equalsIgnoreCase("description"); listProducts.stream() .flatMap(listproducts -> listproducts.getProductAttr().stream()) .flatMap(attr -> attr.getProductAttrValue().stream()) .filter(isSource.or(isDescription)) .forEachOrdered(av -> System.out.println(av.getValue()));
这样修改后,只要元素的label是source或者description,都会被保留并打印出来啦!
内容的提问来源于stack exchange,提问作者Karthikeyan
相关产品推荐
相关产品推荐

