【问题标题】:Guava - Filter by Property and ContainsGuava - 按属性过滤并包含
【发布时间】:2015-03-11 20:59:16
【问题描述】:

我正在尝试按对象中的多个属性进行过滤,在我的例子中是 CarObj:

    List<String> colorList = (List<String>)filterCriteria.get("Color");
    List<String> makeList = (List<String>)filterCriteria.get("Make");
    List<String> rimSizeList = (List<String>)filterCriteria.get("RimSize");

    Predicate<String> predColor = Predicates.in(ImmutableSet.copyOf(colorList));
    Predicate<CarObj> predColor2 = Predicates.compose(predColor ,[????] );

    Predicate<String> predMakeList  = Predicates.in(ImmutableSet.copyOf(makeList));
    Predicate<CarObj> predMakeList2 = Predicates.compose(predMakeList, [????] );

    Predicate<String> predRimSize = Predicates.in(ImmutableSet.copyOf(rimSizeList));
    Predicate<CarObj> predRimSize2 = Predicates.compose(predRimSize, [????] );

    Collection<CarObj> filtered = FluentIterable.from(mAllCars)
            .filter(predColor2)
            .filter(predMakeList2)
            .filter(predRimSize2)
            .toList();

如何输入逻辑来处理 StartsWith 或 Contains 功能? 因此,如果用户在我的 CarObjs 集合中键入“Silver”,则 Model 属性具有“Silverado”、“Silverline”、“Silverpig”、“Tacoma”、“Accord”等...

我想找到一种过滤方法,以便它返回以“Silver”开头的汽车。它将返回符合其他 3 个过滤器(颜色、轮辋尺寸和制造)的 Silverado、Silverline 或 Silverpig 型号的所有汽车

【问题讨论】:

    标签: java collections filter guava


    【解决方案1】:

    在 Java 8 中,您可以编写

    Predicate<CarObj> predColor2 = Predicates.compose(predColor , CarObj::getColor);
    

    但否则你将不得不写

    Predicate<CarObj> predColor2 = Predicates.compose(predColor , 
       new Function<CarObj, String>() {
         @Override public String apply(CarObj car) {
           return car.getColor();
         }
       });
    

    如果您想通过例如过滤startsWith,那就不要用Predicates.compose,而是写

    final Set<String> makes = ImmutableSet.copyOf(makeList);
    Predicate<CarObj> predMake2 = new Predicate<CarObj>() {
      @Override public boolean apply(CarObj car) {
        for (String make : makes) {
          if (car.getMake().startsWith(make)) {
            return true;
          }
        } 
        return false;
      }
    };
    

    【讨论】:

    • 我不确定这是否能回答我的问题,因为我可以按属性(颜色、品牌、轮辋尺寸)进行过滤,但我正在尝试如何按包含或开始于 @987654326 进行过滤@CarObj的属性@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2021-08-22
    • 2015-11-01
    • 2020-08-03
    相关资源
    最近更新 更多