3

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

解决方案

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

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);
                    }
4

2 回答 2

0

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

 Iterables.filter(objects, new Predicate<MyObject>() {
   @Override public boolean apply(MyObject object) {
     return !object.getName().isEmpty(); // or whatever condition here
   }
 });
于 2016-08-01T17:39:22.937 回答
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())
于 2016-08-02T03:41:05.267 回答