java谓词_在Java中谓词
我假設你正在談論來自Guava的com.google.common.base.Predicate 。
從API:
確定給定input的true值或false值。 例如,一個RegexPredicate可能實現了Predicate ,并且對任何匹配給定正則expression式的string返回true。
這本質上是一個booleantesting的OOP抽象。
例如,你可能有一個這樣的幫手方法:
static boolean isEven(int num) { return (num % 2) == 0; // simple }
現在,給定一個List ,你可以像這樣處理偶數:
List numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10); for (int number : numbers) { if (isEven(number)) { process(number); } }
通過Predicate , iftesting被抽象為一個types。 這使得它可以與API的其他部分互操作,比如Iterables ,它有很多使用Predicate實用方法。
因此,你現在可以寫這樣的東西:
Predicate isEven = new Predicate() { @Override public boolean apply(Integer number) { return (number % 2) == 0; } }; Iterable evenNumbers = Iterables.filter(numbers, isEven); for (int number : evenNumbers) { process(number); }
請注意, if沒有iftesting,現在for-each循環要簡單得多。 通過使用Predicate進行filter ,我們定義了Iterable evenNumbers ,從而達到了更高的抽象級別。
API鏈接
Iterables.filter
返回滿足謂詞的元素。
在高階函數上
Predicate允許Iterables.filter作為所謂的高階函數。 就其本身而言,這提供了許多優點。 以上面的List numbers例子。 假設我們要testing所有數字是否都是正數。 我們可以寫這樣的東西:
static boolean isAllPositive(Iterable numbers) { for (Integer number : numbers) { if (number < 0) { return false; } } return true; } //... if (isAllPositive(numbers)) { System.out.println("Yep!"); }
通過一個Predicate ,并與其他庫進行互操作,我們可以寫下這個:
Predicate isPositive = new Predicate() { @Override public boolean apply(Integer number) { return number > 0; } }; //... if (Iterables.all(numbers, isPositive)) { System.out.println("Yep!"); }
希望你現在可以看到更高抽象的例子,比如“用給定謂詞過濾所有元素”,“檢查所有元素是否滿足給定的謂詞”等等,以獲得更好的代碼。
不幸的是,Java沒有一stream的方法:你不能將方法傳遞給Iterables.filter和Iterables.all 。 當然,您可以在Java中傳遞對象 。 因此,定義了Predicatetypes,而是傳遞實現此接口的對象 。
也可以看看
維基百科/高階函數
維基百科/filter(高階函數)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的java谓词_在Java中谓词的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运行photoshop对电脑配置的要求是
- 下一篇: 运行ps的笔记本要求什么配置?