死磕Lambda表達式(六):Consumer、Predicate、Function複合
- 2020 年 4 月 7 日
- 筆記
你的無畏來源於無知。——《三體》
在上一篇文章(傳送門)中介紹了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個默認方法:negate
、and
和or
,用它們可以創建更加複雜的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個默認方法:andThen
和compose
,用它們可以創建更加複雜的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表達式》系列
- 死磕Lambda表達式(一):初識Lambda
- 死磕Lambda表達式(二):Lambda的使用
- 死磕Lambda表達式(三):更簡潔的Lambda
- 死磕Lambda表達式(四):常用的函數式介面
- 死磕Lambda表達式(五):Comparator複合
- 死磕Lambda表達式(六):Consumer、Predicate、Function複合
微信公眾號:萬貓學社
微信掃描二維碼
獲得更多Java技術乾貨
