Java Collections2.filter方法不满足传递的参数

Java Collections2.filter方法不满足传递的参数,java,arraylist,guava,Java,Arraylist,Guava,Am使用Collectins2.filter方法从ArrayList的ArrayList中筛选值,并给出错误信息。它可以与普通的ArrayList完美地配合进行过滤 请找到我的POJO类,我在其中拥有ArrayList of ArrayList Menu.java public class Menu { private String name; private String code; private String action; private String css; pr

Am使用
Collectins2.filter
方法从ArrayList的
ArrayList中筛选值,并给出错误信息。它可以与普通的
ArrayList
完美地配合进行过滤

请找到我的POJO类,我在其中拥有
ArrayList of ArrayList

Menu.java

public class Menu {
  private String name;
  private String code;
  private String action;
  private String css;
  private String symbol;
  private String feature;
  private boolean visibleToExternal = true;
  private Set<String> permissions;

  private ArrayList<Menu> childMenus;
  private ArrayList<ArrayList<Menu>> newChildMenus=new ArrayList<ArrayList<Menu>>();

  public boolean hasChildMenus() {
    newChildMenus.add(subChildMenus);
    return newChildMenus !=null && !newChildMenus.isEmpty();

  }
}
filter()
方法实现过程中给出以下错误

 private Predicate<? super Menu> byRoleAndPermissions(final Role role, final Set<String> permissionsSet) {

        return new Predicate<Menu>() {
          @Override
          public boolean apply(Menu menu) {
            final boolean filterForExternalUser = !role.isRoleInternal() && !menu.isVisibleToExternal() && !(role.getCode().equals("DLR_ADMN") && menu.getCode().equals("MDFY_USER_PRVG"));
            // for dealer and dealer read only related changes : MDFY_USER_PRVG
            if(!role.isRoleInternal() && (role.getCode().equals("DLR") || role.getCode().equals("DLR_RD_ONLY")) && menu.getCode().equals("MDFY_USER_PRVG")){
                return true;
            }
            if (filterForExternalUser) {
              return false;
            }
            SetView<String> intersection = Sets.intersection(menu.getPermissions(), permissionsSet);
            if (intersection.size() == 0) {
              return false;
            }
            if (menu.hasChildMenus()) {

                     menu.setChildMenus(new ArrayList<Menu>(filter(menu.getNewChildMenus(), byRoleAndPermissions(role, permissionsSet))));/// giving error - The method filter(Collection<E>, Predicate<? super E>) in the type Collections2 is not applicable for the arguments (ArrayList<ArrayList<Menu>>, Predicate<capture#4-of ? super Menu>)
            }
            return true;
          }
        };
      }
The method filter(Collection<E>, Predicate<? super E>) in the type Collections2 is not applicable for the arguments (ArrayList<ArrayList<Menu>>, Predicate<capture#4-of ? super Menu>)

您没有在方法内部发送相同的泛型,因此无法调用该方法

一种更清晰的方法是将它们提取到特定的变量中

ArrayList<ArrayList<Menu>> newChildMenus = menu.getNewChildMenus();
Predicate<? super Menu> predicate = byRoleAndPermissions(role, permissionsSet);
ArrayList newChildMenus=menu.getNewChildMenus();

谓词您没有在方法内部发送相同的泛型,因此无法调用该方法

一种更清晰的方法是将它们提取到特定的变量中

ArrayList<ArrayList<Menu>> newChildMenus = menu.getNewChildMenus();
Predicate<? super Menu> predicate = byRoleAndPermissions(role, permissionsSet);
ArrayList newChildMenus=menu.getNewChildMenus();

谓词您的
谓词
和它们的
谓词
是不同的类型

我也花了很长时间用这个挠头。原来有一个非常微妙的问题:
Collections2.filter()
的参数是
com.google.common.base.Predicate
,当时我正在使用
java.util.function.Predicate

实际上,
com.google.common.base.Predicate
的javadoc中提到了一个变通方法:

要在需要
com.google.common.base.Predicate
的地方使用
java.util.function.Predicate
,请使用方法reference
Predicate::test


所以我想您需要编写
过滤器(…,byRoleAndPermissions(role,permissionsSet)::test)
您的
谓词和它们的
谓词是不同的类型

我也花了很长时间用这个挠头。原来有一个非常微妙的问题:
Collections2.filter()
的参数是
com.google.common.base.Predicate
,当时我正在使用
java.util.function.Predicate

实际上,
com.google.common.base.Predicate
的javadoc中提到了一个变通方法:

要在需要
com.google.common.base.Predicate
的地方使用
java.util.function.Predicate
,请使用方法reference
Predicate::test


所以我想您需要编写
过滤器(…,byRoleAndPermissions(role,permissionsSet)::test)

为什么它会工作?您需要传递一个
Predicate@YassinHajaj不,因为:1
ArrayList
是一个
集合
;2.所以
E
ArrayList
;3.所以第二个参数(
PredicateIndeed you's right:)我已经更新了我的代码,但是仍然得到一些错误<代码>缺少该方法的返回类型
为什么它可以工作?您需要传递一个
Predicate@YassinHajaj不,因为:1
ArrayList
是一个
集合
;2.所以
E
ArrayList
;3.所以第二个参数(
PredicateIndeed you's right:)我已经更新了我的代码,但是仍然得到一些错误<缺少方法的代码>返回类型。setChildMenus(新的ArrayList(筛选器)集合,Predicate@Karthikeyan你把你的代码改成那样了吗?为什么你认为它会起作用?我一个多星期都在绞尽脑汁。我没有遇到问题。
menu.setChildMenus(新的ArrayList(过滤器(收集,Predicate@Karthikeyan你把你的代码改成那样了吗?为什么你认为它会起作用?我一个多星期都在绞尽脑汁。我没有把问题解决。。
filter(Collection<E> collection, Predicate<? super E> predicate);