死磕Lambda表達式(六):Consumer、Predicate、Function複合

你的無畏來源於無知。——《三體》

在上一篇文章(傳送門)中介紹了Comparator複合,這次我們來介紹一下其他的複合Lambda表達式。

Consumer複合

Consumer接口中,有一個默認方法andThen,它的入參還是Consumer接口的實例。做完上一個Consumer的操作以後,再做當前Consumer的操作,就像工廠的流水線一樣,比如:

Consumer<Mask> brand = m -> m.setBrand("3M");  Consumer<Mask> type = m -> m.setType("N95");  Consumer<Mask> price = m -> m.setPrice(19.9);  Consumer<Mask> print = System.out::println;    brand.andThen(type)          .andThen(price)          .andThen(print)          .accept(new Mask());  

上面的代碼分別聲明了4個Consumer接口的實例,然後再把它們組裝成一個流水線,先把口罩品牌賦值為3M,再把口罩類型賦值為N95,再把口罩價格賦值為19.9,最後把口罩實例打印出來,運行結果如下:

Mask{brand='3M', type='N95', price=19.9}  

歡迎關注微信公眾號:萬貓學社,每周一分享Java技術乾貨。

Predicate複合

Predicate接口一共有3個默認方法:negateandor,用它們可以創建更加複雜的Predicate接口實例。

negate方法

negate方法就是做非運算。比如,判斷口罩類型是N95:

Mask mask = new Mask("Honeywell", "N95",19.5);  Predicate<Mask> isN95 = m -> "N95".equals(m.getType());  System.out.println(isN95.test(mask));  

運行結果為:

true  

那麼,使用negate方法以後,就變成了判斷口罩類型不是N95:

Mask mask = new Mask("Honeywell", "N95",19.5);  Predicate<Mask> isN95 = m -> "N95".equals(m.getType());  System.out.println(isN95.negate().test(mask));  

運行結果為:

false  

and方法

and方法就是做與運算。比如:

Mask mask = new Mask("Honeywell", "N95",19.5);  Predicate<Mask> isN95 = m -> "N95".equals(m.getType());  Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;  System.out.println(isN95.and(lessThan20).test(mask));  

上面的代碼分別聲明了2個Predicate接口的實例,分別是判斷口罩類型是N95判斷口罩價格小於20,使用and方法以後,表示口罩類型是N95 並且 口罩價格小於20,運行結果如下:

true  

or方法

or方法就是做或運算。比如:

Mask mask = new Mask("Honeywell", "N95", 21.5);  Predicate<Mask> isN95 = m -> "N95".equals(m.getType());  Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;  System.out.println(isN95.or(lessThan20).test(mask));  

上面的代碼分別聲明了2個Predicate接口的實例,分別是判斷口罩類型是N95判斷口罩價格小於20,使用or方法以後,表示口罩類型是N95 或者 口罩價格小於20,運行結果如下:

true  

and方法和or方法組合使用

當and方法和or方法組合使用時,優先級是由在Lambda表達式鏈中的位置決定的,從左到右優先級從高到低,比如:

Mask mask = new Mask("3M", "N95", 21.5);  Predicate<Mask> is3M = m -> "3M".equals(m.getType());  Predicate<Mask> isN95 = m -> "N95".equals(m.getType());  Predicate<Mask> lessThan20 = m -> m.getPrice() < 20.0;  System.out.println(is3M.or(isN95).and(lessThan20).test(mask));  

上面的代碼分別聲明了3個Predicate接口的實例,分別是判斷口罩品牌是3M判斷口罩類型是N95判斷口罩價格小於20,3個Predicate組合以後是is3M.or(isN95).and(lessThan20),根據從左到右優先級從高到低,組合以後的邏輯是(is3M || isN95 ) && lessThan20,所以運行結果如下:

false  

歡迎關注微信公眾號:萬貓學社,每周一分享Java技術乾貨。

Function複合

Function接口一共有2個默認方法:andThencompose,用它們可以創建更加複雜的Function接口實例。

andThen方法

Function接口的andThen方法,和Consumer接口的類似,它的入參還是Function接口的實例。做完上一個Function的操作以後,再做當前Function的操作,比如:

Function<Integer, Integer> plusTwo = x -> x + 2;  Function<Integer, Integer> timesThree = x -> x * 3;  System.out.println(plusTwo.andThen(timesThree).apply(1));  System.out.println(plusTwo.andThen(timesThree).apply(2));  System.out.println(plusTwo.andThen(timesThree).apply(3));  

上面的代碼分別聲明了2個Function接口的實例,先加2,然後再乘以3,也就是(x + 2) * 3,運行結果如下:

9  12  15  

compose方法

Function接口的compose方法,和andThen方法相反的,先做當前Function的操作,然後再做上一個Function的操作,比如:

Function<Integer, Integer> plusTwo = x -> x + 2;  Function<Integer, Integer> timesThree = x -> x * 3;  System.out.println(plusTwo.compose(timesThree).apply(1));  System.out.println(plusTwo.compose(timesThree).apply(2));  System.out.println(plusTwo.compose(timesThree).apply(3));  

上面的代碼分別聲明了2個Function接口的實例,先乘以3,然後再加2,也就是(x * 3) + 2,運行結果如下:

5  8  11  

《死磕Lambda表達式》系列

微信公眾號:萬貓學社

微信掃描二維碼

獲得更多Java技術乾貨