一、Java8 内置的四大核心函数式接口

之前我们使用Lambda表达式之前都需要手动地去创建函数式的接口,但其实我们不必这样做,因为JDK8已经为我们提供好了四大核心函数式接口,即:

Consumer<T>: 消费型接口

  1. void accept(T t);

Supplier<T>: 供给型接口

  1. T get();

Function<T, R>: 函数型接口

  1. R apply(T t);

Predicate<T>: 断言型接口

  1. boolean test(T t);

1. 消费型接口 Consumer

  1. @FunctionalInterface
  2. public interface Consumer<T> {
  3. void accept(T t);
  4. ...
  5. }

即实现该函数式接口时需要提供一个单个参数、无返回值的Lambda表达式,应用如下:

  1. // Consumer<T>: 消费型接口
  2. @Test
  3. public void t1() {
  4. happy(1000, x -> System.out.println("每次消费金额:"+x));
  5. }
  6. public void happy(double money, Consumer<Double> consumer) {
  7. consumer.accept(money);
  8. }

2. 供给型接口 Supplier

  1. @FunctionalInterface
  2. public interface Supplier<T> {
  3. T get();
  4. }

即实现该函数式接口时需要提供一个无输入参数、有返回值的Lambda表达式,应用如下:

  1. // 需求:产生指定个数整数,并放入集合中
  2. @Test
  3. public void t2() {
  4. List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
  5. System.out.println(numList);
  6. }
  7. public List<Integer> getNumList(int num, Supplier<Integer> supplier) {
  8. List<Integer> list = new ArrayList<>();
  9. for (int i = 0; i < num; i++) {
  10. list.add(supplier.get());
  11. }
  12. return list;
  13. }

3. 函数型接口 Function

  1. @FunctionalInterface
  2. public interface Function<T, R> {
  3. /**
  4. * Applies this function to the given argument.
  5. *
  6. * @param t the function argument
  7. * @return the function result
  8. */
  9. R apply(T t);
  10. ...
  11. }

即实现该函数式接口时需要提供一个带一个输入参数、有返回值的Lambda表达式,应用如下:

  1. // 需求:处理字符串
  2. @Test
  3. public void t3() {
  4. String res = strHandler("abcdefg", s -> s.toUpperCase());
  5. System.out.println(res);
  6. }
  7. public String strHandler(String str, Function<String, String> function) {
  8. String res = function.apply(str);
  9. return res;
  10. }

4.断言型接口 Predicate

  1. @FunctionalInterface
  2. public interface Predicate<T> {
  3. /**
  4. * @param t the input argument
  5. * @return {@code true} if the input argument matches the predicate,
  6. * otherwise {@code false}
  7. */
  8. boolean test(T t);
  9. ...
  10. }

即实现该函数式接口时需要提供一个带一个输入参数、返回值为boolean类型的Lambda表达式,应用如下:

  1. // 需求:将满足条件的字符串,放入到集合中
  2. @Test
  3. public void t4() {
  4. List<String> list = Arrays.asList("Hello", "atguigu", "Lambda", "www", "ok");
  5. List<String> res = filterStr(list, s -> s.length() > 3);
  6. res.forEach(System.out::println);
  7. }
  8. public List<String> filterStr(List<String> list, Predicate<String> predicate) {
  9. List<String> res = new ArrayList<>();
  10. for (String s : list) {
  11. if (predicate.test(s)) {
  12. res.add(s);
  13. }
  14. }
  15. return res;
  16. }

二、方法引用

若Lambda体中的内容有方法已经实现了,我们可以使用“方法引用”(可以理解为方法引用是Lambda表达式的另外一种标新形式)

相当于参数照搬到某个方法的参数列表中的一种简写

语法格式

对象::实例方法名

  1. // 对象::实例方法名
  2. @Test
  3. public void t1() {
  4. Consumer<String> con = s -> System.out.println(s);
  5. PrintStream ps = System.out;
  6. Consumer<String> con1 = ps::println;
  7. }

类::静态方法名

  1. //类::静态方法名
  2. @Test
  3. public void t3() {
  4. Comparator<Integer> com = (o1, o2) -> Integer.compare(o1, o2);
  5. Comparator<Integer> com2 = Integer::compareTo;
  6. }

类::实例方法名

Lambda表达式参数列表中的第一个参数是实例方法的调用者第二个参数是方法的参数时,可以使用ClassName::fuction

  1. // 类::实例方法名
  2. @Test
  3. public void t4() {
  4. BiPredicate<String, String> bp = (s, s2) -> s.equals(s2);
  5. BiPredicate<String, String> bp2 = String::equals;
  6. }

三、构造器引用

需要调用的构造器的参数列表要与函数式接口中抽象方法的参数列表保持一致

  1. // 构造器引用,ClassName::new
  2. @Test
  3. public void t5() {
  4. Supplier<Employee> sup = () -> new Employee();
  5. Supplier<Employee> sup2 = Employee::new;
  6. }
  7. @Test
  8. public void t6() {
  9. Function<Integer, Employee> fun = x -> new Employee(x);
  10. Function<Integer, Employee> fun1 = Employee::new;
  11. }

下一步:Java8 Stream API的使用(企业开发常用)

Java8 Lambda表达式(二)的更多相关文章

  1. Java8 Lambda表达式(一)

    目录 一.应用场景引入 优化一:使用策略模式 优化二:使用匿名内部类 优化三:使用Lambda表达式 优化四:使用Stream API 二.Lambda运算符和对应语法 语法格式 Lambda表达式需 ...

  2. java8 Lambda表达式的新手上车指南(1)

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  3. java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口

    背景 java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式 ...

  4. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  5. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

  6. Java8——Lambda表达式

    /* * 一.Lambda 表达式的基础语法:Java8中引入了一个新的操作符 "->" 该操作符称为箭头操作符或 Lambda 操作符 * 箭头操作符将 Lambda 表达 ...

  7. Java8 Lambda表达式、Optional类浅析

    1.概念 Lambda是一个匿名函数,可以将其理解为一段可以传递的代码(将代码像数据一样进行传递)可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使得java语言的表达能利得到了提升. 2. ...

  8. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  9. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

随机推荐

  1. 解决“与 Microsoft Exchange 的连接不可用,Outlook 必须联机或已连接才能完成此操作”

    Microsoft Outlook 是一种用于发送和接收电子邮件的应用程序.由于其可靠性和各种使用类型,它在企业公司中非常受欢迎.Outlook 还可用于管理各种类型的个人数据,如日历约会.联系人.邮 ...

  2. 2、linux防火墙的使用(firewalld)

    2.1.说明: 1.在 RHEL7 里有几种防火墙共存,firewalld.iptables,默认是使用 firewalld 来管理 netfilter 子系统,不过底层调用的命令仍然是 iptabl ...

  3. 5、could not start the service mysql

    1.这个原因是因为mysql多次安装没有卸载干净的原因; 2.解决办法是: (1)删除系统中已经安装的mysql目录中的内容: (2)同时按住"win+r"键调出"运行& ...

  4. 关于TreeView的实例

    前台代码 (只需要有TreeView控件, 添加ID,其他默认生成) <form id="form1" runat="server"> <di ...

  5. 解决List遍历删除元素提示ConcurrentModificationException

    JDK1.8提供新的API  ===>  removeIf public static void main(String[] args) { List<String> list = ...

  6. 自然语言处理(NLP)——简介

    自然语言处理(NLP Natural Language Processing)是一种专业分析人类语言的人工智能.就是在机器语⾔和⼈类语言之间沟通的桥梁,以实现人机交流的目的. 在人工智能出现之前,机器 ...

  7. nmon工具安装及nmon analyser的使用

    步骤一:下载nmon及nmon analyser工具 nmon:http://nmon.sourceforge.net/pmwiki.php 根据自己系统的版本下载相应的版本即可 nmon analy ...

  8. 密码学系列之:memory-bound函数

    密码学系列之:memory-bound函数 目录 简介 内存函数 内存受限函数 内存受限函数的使用 简介 memory-bound函数可以称为内存受限函数,它是指完成给定计算问题的时间主要取决于保存工 ...

  9. 如何为HttpServer服务器配置PHP FastCGI,从而让HttpServer具备动态交互能力

    一.软件准备 1.下载HttpServer :HttpServer.zip HttpServer是一款windows平台下基于IOCP模型的轻量级.高并发.高性能web服务器(参见文章). 2.下载W ...

  10. 续PA协商过程

    续PA协商过程 当sw3的接口恢复之后会发生2中情况. ①sw3的G0/0/2口先发BPDU ②sw3的G0/0/3口先发BPDU sw3先发送BPDU sw3和sw1的交互过程: sw3的2口恢复后 ...