仅当谓词输入不是使用Guava的空字符串时才过滤对象

时间:2016-07-31 18:43:56

标签: java list filter guava android-guava

我正在学习番石榴,我有一个问题。我有三个可能的字符串过滤器。问题是我只想在字符串不是""(空字符串)时过滤对象集合。我的另一个问题是如何从像object.getName() == firstStringFilter这样的对象中过滤不同的成员。如果有人知道如何做到这一点,我会非常感激。

这是我最终对我的代码所做的。如果我的firstString过滤器不为空,则应用该过滤器,并与其他两个字符串过滤器相同。我正在使用相同的List并用过滤器的结果覆盖它。

List<Field> fieldList = mLand.getFields();

                    if(!filterPattern.equalsIgnoreCase(""))
                    {
                        Predicate predicate = new Predicate<Field>()
                        {
                            @Override
                            public boolean apply(Field input)
                            {
                                return input.getName()
                                        .toLowerCase()
                                        .contains(filterPattern);
                            }
                        };

                        Collection<Field> result = Collections2.filter(fieldList, predicate);

                        fieldList = new ArrayList<>(result);

                    }

                    if(!cropStringPattern.equalsIgnoreCase(""))
                    {
                        Predicate predicate = new Predicate<Field>()
                        {
                            @Override
                            public boolean apply(Field input)
                            {
                                return input.getCrop().getName()
                                        .toLowerCase()
                                        .contains(cropStringPattern);
                            }
                        };

                        Collection<Field> result = Collections2.filter(fieldList, predicate);

                        fieldList = new ArrayList<>(result);
                    }

                    if(!varietyStringPattern.equalsIgnoreCase(""))
                    {
                        Predicate predicate = new Predicate<Field>()
                        {
                            @Override
                            public boolean apply(Field input)
                            {
                                return input.getCrop().getVariety().getName()
                                        .toLowerCase()
                                        .contains(varietyStringPattern);
                            }
                        };

                        Collection<Field> result = Collections2.filter(fieldList, predicate);

                        fieldList = new ArrayList<>(result);
                    }

2 个答案:

答案 0 :(得分:0)

听起来你的对象不是字符串而是它们有字符串属性,所以这就像是

 Iterables.filter(objects, new Predicate<MyObject>() {
   @Override public boolean apply(MyObject object) {
     return !object.getName().isEmpty(); // or whatever condition here
   }
 });

答案 1 :(得分:0)

您并不完全清楚自己要问的是什么,但似乎您正试图通过生成字符串的方法的结果来过滤集合。如果是这样的话,你应该可以使用这样的东西:

public static <T> Collection<T> filter(Collection<T> collection, String filter, Function<T, String> function) {
    // assumes static import of com.google.common.base.Predicates.*
    return Collections2.filter(collection, compose(not(equalTo(filter)), function));
}

现在你可以打电话了

filter(myCollection, "", new Function<MyClass, String>() {
    @Override
    public String apply(MyClass input) {
        return input.getName();
    }
)

它将从集合中过滤任何具有空名称的对象。

我假设您不使用Java 8.如果您愿意,那么您不会 真的需要谓词助手。你可以打电话

Collections2.filter(myCollection, obj -> !obj.getName().isEmpty())