死磕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技術干貨


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM