2017-10-09 88 views
0

我對Java非常陌生,遵循一個課程來更好地理解它。在下面的Test code中,我們應該能夠創建一個接受多個Predicate的方法。我似乎無法做到。 Collections似乎合乎邏輯,但無法使用。所以我認爲Predicate<T>[] predicates就足夠了。但在那裏沒有成功。接受多個謂詞作爲方法的參數

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

測試代碼

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

怎麼可能接受多個Predicate作爲參數傳遞給方法?

+3

你可能尋找指定的可變參數 –

回答

1

爲了一個方法接受同一類型的參數數目不詳,你需要使用varargs,這是一個省略號

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

THX優素福。確實確定了它。 – DarkLite1

+0

你可能想用'SafeVarargs'來註釋它 – newacct

相關問題