摘要:上一篇我們學習了和函數式接口,本篇繼續了解下其他常用的函數式接口。方法同樣接收一個類型,將傳入的條件和當前的條件以或者的關系過濾數據。就是將當前條件取反。而返回的這個函數式接口實例是通過傳入的的方法進行判斷的。
上一篇我們學習了Function和BiFunction函數式接口,本篇繼續了解下其他常用的函數式接口。
先來看下Predicate
Predicate函數式接口的主要作用就是提供一個test方法,接受一個參數返回一個布爾類型,Predicate在stream api中進行一些判斷的時候非常常用。
@FunctionalInterface public interface Predicate{ /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(T t); }
使用泛型T指定傳入的參數類型,我們通過一個根據不同條件取出不同數據的例子來看下Predicate具體應用
public class PredicateTest { public static void main(String[] args) { Listlist = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); PredicateTest predicateTest = new PredicateTest(); //輸出大于5的數字 List result = predicateTest.conditionFilter(list, integer -> integer > 5); result.forEach(System.out::println); System.out.println("-------"); //輸出大于等于5的數字 result = predicateTest.conditionFilter(list, integer -> integer >= 5); result.forEach(System.out::println); System.out.println("-------"); //輸出小于8的數字 result = predicateTest.conditionFilter(list, integer -> integer < 8); result.forEach(System.out::println); System.out.println("-------"); //輸出所有數字 result = predicateTest.conditionFilter(list, integer -> true); result.forEach(System.out::println); System.out.println("-------"); } //高度抽象的方法定義,復用性高 public List conditionFilter(List list, Predicate predicate){ return list.stream().filter(predicate).collect(Collectors.toList()); } }
我們只定義了一個conditionFilter方法,stream()會將當前list作為源創建一個Stream對象,collect(Collectors.toList())是將最終的結果封裝在ArrayList中(這部分會在后續stream學習中詳細介紹,這里只關注filter即可),filter方法接收一個Predicate類型參數用于對目標集合進行過濾。里面并沒有任何具體的邏輯,提供了一種更高層次的抽象化,我們可以把要處理的數據和具體的邏輯通過參數傳遞給conditionFilter即可。理解了這種設計思想后,再看上面的例子就很容易理解,本身邏輯并不復雜,分別取出小于5、大于等于5、小于8的元素,最后一個總是返回true的條件意味著打印出集合中所有元素。
除此之外,Predicate還提供了另外三個默認方法和一個靜態方法
default Predicateand(Predicate super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t); } default Predicate or(Predicate super T> other) { Objects.requireNonNull(other); return (t) -> test(t) || other.test(t); } default Predicate negate() { return (t) -> !test(t); } static Predicate isEqual(Object targetRef) { return (null == targetRef) ? Objects::isNull : object -> targetRef.equals(object); }
and方法接收一個Predicate類型,也就是將傳入的條件和當前條件以并且的關系過濾數據。or方法同樣接收一個Predicate類型,將傳入的條件和當前的條件以或者的關系過濾數據。negate就是將當前條件取反。看下具體使用方式
public ListconditionFilterNegate(List list, Predicate predicate){ return list.stream().filter(predicate.negate()).collect(Collectors.toList()); } public List conditionFilterAnd(List list, Predicate predicate,Predicate predicate2){ return list.stream().filter(predicate.and(predicate2)).collect(Collectors.toList()); } public List conditionFilterOr(List list, Predicate predicate,Predicate predicate2){ return list.stream().filter(predicate.or(predicate2)).collect(Collectors.toList()); } //大于5并且是偶數 result = predicateTest.conditionFilterAnd(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0); result.forEach(System.out::println);//6 8 10 System.out.println("-------"); //大于5或者是偶數 result = predicateTest.conditionFilterOr(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0); result.forEach(System.out::println);//2 4 6 8 9 10 System.out.println("-------"); //條件取反 result = predicateTest.conditionFilterNegate(list,integer2 -> integer2 > 5); result.forEach(System.out::println);// 1 2 3 4 5 System.out.println("-------");
我們分別借助Predicate的三個默認方法定義了conditionFilterAnd、conditionFilterOr和conditionFilterNegate方法。然后再下方調用這三個方法,根據傳入的判斷條件觀察輸出結果。
最后再來看一下Predicate接口中的唯一一個靜態方法,Java8中接口中除了增加了默認方法也可以定義靜態方法。
/** * Returns a predicate that tests if two arguments are equal according * to {@link Objects#equals(Object, Object)}. * * @paramthe type of arguments to the predicate * @param targetRef the object reference with which to compare for equality, * which may be {@code null} * @return a predicate that tests if two arguments are equal according * to {@link Objects#equals(Object, Object)} */ static Predicate isEqual(Object targetRef) { return (null == targetRef) ? Objects::isNull : object -> targetRef.equals(object); }
isEqual方法返回類型也是Predicate,也就是說通過isEqual方法得到的也是一個用來進行條件判斷的函數式接口實例。而返回的這個函數式接口實例是通過傳入的targetRef的equals方法進行判斷的。我們看一下具體用法
System.out.println(Predicate.isEqual("test").test("test"));//true
這里會用第一個"test"的equals方法判斷與第二個"test"是否相等,結果true。
下一篇
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70682.html
摘要:函數式接口進階與默認方法詳解上一篇我們快速的借助示例演示了的簡單應用,體會到了使用對集合處理的便捷和其與函數式接口密不可分的關系,所以為了更高效的使用,有必要更熟練的掌握函數式接口。 Java8-5-函數式接口進階與默認方法詳解上一篇我們快速的借助示例演示了stream api的簡單應用,體會到了使用stream api對集合處理的便捷和其與函數式接口密不可分的關系,所以為了更高效的使...
摘要:接口接口作為集合類的父類接口,位于包下,定義了很多集合操作的方法。今天我希望通過對源碼的查閱來對接口有所認識,下面我們直接進入源碼分析接口源碼可以看出,接口繼承接口。 Collection接口 Collection接口作為集合類的父類接口,Collectio位于java.util包下,Collectio定義了很多集合操作的方法。今天我希望通過對源碼的查閱來對Collection接口有所...
摘要:集合的種類常見的集合類分如下幾個種類詳解接口是和接口的父接口,也是集合類除外根接口。接口集合中元素的存放特點是元素有序,同一元素可重復。總結中集合是一個非常重要的知識點,在實際運用中也是常常會使用到。 集合的種類 常見的集合類分如下幾個種類: Collection - List - ArrayList - LinkedList - Set - HashSet...
摘要:方法比如一個修改用戶名和密碼的需求,我們把它寫在一個方法里天津市上述代碼的方法職責不明確,既有修改用戶名又修改地址,不符合單一職責原則。 Android學習資源分享合集(1)-視頻資源 簡介: 單一職責原則(SRP:Single responsibility principle),它規定一個類應該只有一個發生變化的原因。所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這...
摘要:實現原理創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。具體來說,就是返回一個包含和兩個屬性的對象。接口部署在對象的屬性上可以調用這個屬性,就得到遍歷器對象。 Iterator實現原理 創建一個指針對象,指向當前數據結構的起始位置。也就是說,遍歷器對象本質上,就是一個指針對象。 第一次調用指針對象的next方法,可以將指針指向數據結構的第一...
閱讀 662·2021-11-24 09:39
閱讀 2315·2021-11-22 13:54
閱讀 2197·2021-09-23 11:46
閱讀 3246·2019-08-30 15:55
閱讀 2679·2019-08-30 15:54
閱讀 2403·2019-08-30 14:18
閱讀 1546·2019-08-29 14:15
閱讀 2732·2019-08-29 13:49