2017-10-09 4 views
0

Ich bin ziemlich neu in Java und nach einem Kurs, um es besser zu verstehen. In der folgenden Test code sollen wir in der Lage sein, eine Methode zu erstellen, die mehrere Predicate akzeptiert. Ich kann es nicht richtig verstehen. Collections scheint logisch, aber sie können nicht verwendet werden. also dachte ich, Predicate<T>[] predicates würde ausreichen. Aber kein Erfolg dort.Akzeptieren Sie mehrere Prädikate als Argument für die Methode

public class Utils { 
// public static <T> Predicate<T> anyPassPredicate(Predicate<T>[] predicates) { 
    public static <T> Predicate<T> anyPassPredicate(Collection<Predicate<T>> predicates) { 
     Predicate<T> pred = predicates.stream().reduce(Predicate::or).orElse(x->false);; 
     return pred; 
    } 

    public static <T> T firstAnyMatch(List<T> list, Predicate<T> predicate) { 
     for (T element : list) { 
      if (predicate.test(element)) { 
       return element; 
      } 
     } 
     return null; 
    } 
} 

Prüfregeln

public class Test { 
    public static void main(String[] args) { 
     List<String> words = Arrays.asList("Jan", "Jos", "Anna", "Pieter", "Johan"); 
     Predicate<String> anyMatch = Utils.anyPassPredicate(s -> s.contains("o"), s -> s.length() > 5); 
     Utils.firstAnyMatch(words, anyMatch); 
    } 
} 

Wie ist es möglich, mehr Predicate als Argument für die Methode zu akzeptieren?

+3

Du bist wahrscheinlich für Yosef varargs –

Antwort

1

für ein Verfahren Um eine unbestimmte Anzahl von Argumenten des gleichen Typs zu übernehmen, müssen Sie varargs, verwenden, die durch ein Auslassungszeichen angegeben

static <T> Predicate<T> anyPassPredicate(Predicate<T>... predicates) { 
    return Arrays.stream(predicates) 
     .reduce(Predicate::or) 
     .orElse(x->false); 
} 
+0

Thx suchen. das hat es tatsächlich behoben. – DarkLite1

+0

möchten Sie vielleicht mit 'SafeVarargs' kommentieren – newacct

Verwandte Themen