簡單來說,當我明確知道此次判斷的邏輯時就可以直接使用if,但是我這次的判斷邏輯可能會隨著某個參數變化的時候使用Predicate
比如當我想要判斷某長段文字中是否包含list<String> 中的元素,并且包含的元素個數大于 list<String>最后一個被轉換為string 格式的int數
這時候作為判斷元素的list<String>是不定的,但是邏輯是定了的,所以就可以使用Predicate來構建
public static Predicate<String> createTextChecker(List<String> checkList) {//省略合法性判斷// 提取范圍int threshold;try {threshold = Integer.parseInt(checkList.get(checkList.size() - 1));} catch (NumberFormatException e) {throw new IllegalArgumentException("列表最后一個元素必須是整數格式");}// 返回判斷邏輯return text -> {long count = checkList.stream().limit(checkList.size() - 1) // 排除最后一個閾值元素.filter(element -> text.contains(element)).count();return count > threshold;};
然后你可以這樣使用它
List<String> list1 = List.of("長歌", "短笛", "2"); Predicate<String> checker1 = createTextChecker(list1); System.out.println(checker1.test("長歌與風在嶺外,短笛聲聲盼歸來。"));
日后作為條件的list1就可以不固定,可以按照邏輯改變
Predicate.negate()
當前的Predicate判斷取反
Predicate.or()
這里需要傳入一個別的Predicate,當兩個Predicate其中一個滿足的時候就返回true
Predicate.and()
這里需要傳入一個別的Predicate,當兩個Predicate都滿足的時候就返回true
Predicate.test()
這里需要傳入一個參數,就這個例子來說參數類型由上面的方法
Predicate<String> createTextChecker
中的紅色位置的類型決定
用于執行判斷邏輯
Predicate.equals()
用于對比兩個Predicate是否屬于同一地址(邏輯一樣,但是地址不同也不會判為相同)