簡介
Java 8引入了許多函數式接口Functional Interface,Predicate則是常用的一個。Predicate主要的方法為:
boolean test(T t);
它傳入一個對象,并傳回一個boolean值,這在stream中用得非常多,本文簡單介紹它的基本用法。
基本用法
(1)單一filter中的使用
List<String> names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
List<String> result = names.stream()
.filter(name -> name.contains("m"))
.collect(Collectors.toList());
assertEquals(3, result.size());
assertTrue(result.contains("Jeremy"));
代碼中,name -> name.contains("m"),為Predicate,表示字元串包含"m"的才滿足條件。
(2)多個filter中的使用
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(name -> name.startsWith("S"))
.filter(name -> name.contains("m"))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertEquals(asList("Sam", "Simon"), result);
通過filter可以不斷連接配接各種條件判斷。
(3)條件運算符組合使用
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(name -> name.startsWith("S") && name.contains("m"))
.collect(Collectors.toList());
assertEquals(2, result.size());
assertEquals(asList("Sam", "Simon"), result);
通過條件運算符'&'、'|'和'!'等實作與或非。
組合用法
(1)與門and的使用
Predicate<String> startsWith_S = str -> str.startsWith("S");
Predicate<String> contains_m = str -> str.contains("m");
//and
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(startsWith_S.and(contains_m))
.collect(Collectors.toList());
assertEquals(asList("Sam", "Simon"), result);
通過Predicate.and()方法,把兩個條件組合起來,表示需要同時滿足兩個條件。
(2)或門or的使用
//or
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(startsWith_S.or(contains_m))
.collect(Collectors.toList());
assertEquals(asList("Jeremy", "Sam", "Simon"), result);
(3)非門negeate的使用
//negate
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(startsWith_S.negate())
.collect(Collectors.toList());
assertEquals(asList("Larry", "Jeremy", "Mike"), result);
(4)多個合并使用
//Collection
Predicate<String> length_gt4 = str -> str.length() > 4;
List<Predicate<String>> allPredicates = asList(
startsWith_S,
contains_m,
length_gt4
);
//and
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(allPredicates.stream().reduce(x -> true, Predicate::and))
.collect(Collectors.toList());
assertEquals(singletonList("Simon"), result);
//or
names = asList("Larry", "Jeremy", "Sam", "Simon", "Mike");
result = names.stream()
.filter(allPredicates.stream().reduce(x -> false, Predicate::or))
.collect(Collectors.toList());
assertEquals(asList("Larry", "Jeremy", "Sam", "Simon"), result);
需要注意的是:
'與'邏輯的時候,開始為x -> true;
而'或'邏輯的時候,開始為x -> false。
總結
Predicate在Java 8中很常用,特别是在Optional和Stream等有filter時,需要靈活掌握其基本用法。
---------THE END----------
覺得不錯就掃碼關注公衆号呗,更多精彩還在後面哦~
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbwxCdh1mcvZ2LcV2Zh1Wa9M3clN2byBXLzN3btg3PBRkTygzURpXSXF2dOdVYaxmViFmUYRGbapXWxUEbatkTYNWNwdUTWBXMWZnVH1kSkZUYzpEMillV6lFckpWWwhXRaJTRXFGMadVW0JkeaFDNwImeKpnVZJFbkFTQUR1RGZ1UzpFVZtEauZVeNd1YHFDMitmVWdFMFdVYyJFMZJDO5p1dwJDW2wWbZRXMywUdO1GTqx2RjhXNpVGcKdlY0lTeMZTTINGMShUYvwlbj5yZtlmbkN3YuQnclZnbvN2Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
學好技術,過好生活。