2016-07-31 22 views
3

Ich lerne gerade Guava und ich habe ein Problem. Ich habe drei mögliche String-Filter. Die Sache ist, dass ich nur die Objektsammlung filtern möchte, wenn die Zeichenfolge nicht "" (leere Zeichenfolge) ist. Meine andere Frage ist, wie kann ich verschiedene Mitglieder von dem Objekt wie object.getName() == firstStringFilter filtern. Wenn jemand weiß, wie man das macht, wäre ich wirklich dankbar.Filter-Objekt nur, wenn Prädikat Eingabe ist nicht die leere Zeichenfolge mit Guava

SOLUTION

Dies ist, was ich mit meinem Code schließlich tat. Wenn mein firstString-Filter nicht leer ist, dann wende diesen Filter an, und dasselbe gilt für die anderen beiden String-Filter. Ich verwende dieselbe Liste und überschreibe sie mit den Ergebnissen der Filter.

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); 
        } 
+0

Verwenden Sie Java 8? – shmosel

Antwort

0

Es klingt nicht wie Ihre Objekte Strings sind, sondern haben sie eine String-Eigenschaft, so wäre dies nur so etwas wie

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

Ich habe gerade meine Frage bearbeitet, um besser zu erklären, was ich tun musste. Danke für deine Antwort! –

0

Es ist nicht ganz klar ist, was Sie fragen, aber Es scheint, als ob Sie versuchen, eine Sammlung nach dem Ergebnis einer Methode zu filtern, die eine Zeichenfolge erzeugt. Wenn das der Fall ist, sollten Sie in der Lage sein, so etwas zu verwenden:

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

Jetzt können Sie

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

nennen und es werden alle Objekte mit einem leeren Namen aus den Sammlungen filtern.

Ich gehe mit der Annahme, dass Sie nicht Java 8 verwenden. Wenn Sie sind, brauchen Sie nicht die die Prädikat Helfer. Sie können einfach anrufen

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

Ich habe gerade meine Frage bearbeitet und erklärt auf eine bessere Art und Weise, was ich tun musste. Danke für deine Antwort! –