番石榴过滤器问题

Cri*_*riu 2 java guava

你能解释为什么我的过滤不起作用吗?(过滤器未完成,消息未打印出来).

@Override
protected void fetchValueObjectsListPostSpecificAction() {
    logger.info("~~~size:" + this.valueObjectsList.size());
    // show only scenarios which have applications related defined
    Collections2.filter(this.valueObjectsList, new Predicate<PlanScenarioVo>() {
        @Override
        public boolean apply(final PlanScenarioVo arg0) {
            System.out.println("!!!!!!!!!!---FILTER");
            return (StringUtils.isNotEmpty(arg0.getApplication().getInternalId()));
        }
    });
    logger.info("~~~size POST:" + this.valueObjectsList.size());
}
Run Code Online (Sandbox Code Playgroud)

至少我想确保它进入apply方法,但我没有看到任何输出,只有size(6)和大小POST(6).

~~~size:6 
~~~size POST:6
Run Code Online (Sandbox Code Playgroud)

你觉得这个方法有问题吗?

谢谢,

Mis*_*ble 8

Collections2.filter 返回已过滤的Collection,它不会修改传递的集合.

编辑 正如JB Nizmet在下面解释的那样,Collections2.filter是对原始集合的一个视图,Predicate只有在实际迭代结果或访问结果时才会看到评估.

将结果分配给变量,打印其大小,并在调试器内的谓词方法中查看堆栈跟踪将非常有用.

  • 返回的集合不是第一个只包含已接受元素的副本.这是对原始视图的看法.返回集合的每个方法都将使用谓词来计算其结果.例如,迭代返回的集合将调用每个元素上的谓词,以确定是否必须忽略当前元素. (2认同)
  • 顺便提一下,如果你*需要一个就地过滤器,你可以使用[Iterables.removeIf](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Iterables的.html#removeIf%28java.lang.Iterable,%20com.google.common.base.Predicate%29).但通常视图更方便. (2认同)