第三部分 第十二章 3.常用函数式接口(一)
条评论12.3 常用函数式接口
JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在java.util.function
包中被提供。下面是最简单的几个接口及使用示例。
12.3.1 Supplier接口
java.util.function.Supplier<T>
接口仅包含一个无参的方法:T get()
。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。
1 | import java.util.function.Supplier; |
12.3.2 练习:求数组元素最大值
题目
使用Supplier
接口作为方法参数类型,通过Lambda表达式求出int数组中的最大值。提示:接口的泛型请使用java.lang.Integer
类。
解答
1 | public class Demo02Test { |
12.3.3 Consumer接口
java.util.function.Consumer<T>
接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
抽象方法:accept
Consumer
接口中包含抽象方法void accept(T t)
,意为消费一个指定泛型的数据。基本使用如:
1 | import java.util.function.Consumer; |
当然,更好的写法是使用方法引用。
默认方法:andThen
如果一个方法的参数和返回值全都是Consumer
类型,那么就可以实现效果:消费数据的时候,首先做一个操作,然后再做一个操作,实现组合。而这个方法就是Consumer
接口中的default方法andThen
。下面是JDK的源代码:
1 | default Consumer<T> andThen(Consumer<? super T> after) { |
备注:
java.util.Objects
的requireNonNull()
静态方法将会在参数为null时主动抛出NullPointerException
异常。这省去了重复编写if语句和抛出空指针异常的麻烦。
要想实现组合,需要两个或多个Lambda表达式即可,而andThen
的语义正是“一步接一步”操作。例如两个步骤组合的情况:
1 | import java.util.function.Consumer; |
运行结果将会首先打印完全大写的HELLO,然后打印完全小写的hello。当然,通过链式写法可以实现更多步骤的组合。
12.3.4 练习:格式化打印信息
题目
下面的字符串数组当中存有多条信息,请按照格式“ 姓名:XX。性别:XX
。”的格式将信息打印出来。要求将打印姓名的动作作为第一个Consumer
接口的Lambda实例,将打印性别的动作作为第二个Consumer
接口的Lambda实例,将两个Consumer
接口按照顺序“拼接”到一起。
1 | public static void main(String[] args) { |
解答
1 | import java.util.function.Consumer; |
本文标题:第三部分 第十二章 3.常用函数式接口(一)
文章作者:foreverSFJ
发布时间:2019-08-22 10:44:17
最后更新:2019-08-22 10:44:17
原始链接:Notes/Java/Basic/Part03/12_3_1 常用函数式接口(一).html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!
分享