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

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

Consumer<T>: 消费型接口

void accept(T t);

Supplier<T>: 供给型接口

T get();

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

R apply(T t);

Predicate<T>: 断言型接口

boolean test(T t);

1. 消费型接口 Consumer

@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
...
}

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

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

2. 供给型接口 Supplier

@FunctionalInterface
public interface Supplier<T> {
T get();
}

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

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

3. 函数型接口 Function

@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
...
}

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

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

4.断言型接口 Predicate

@FunctionalInterface
public interface Predicate<T> {
/**
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
...
}

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

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

二、方法引用

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

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

语法格式

对象::实例方法名

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

类::静态方法名

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

类::实例方法名

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

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

三、构造器引用

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

// 构造器引用,ClassName::new
@Test
public void t5() {
Supplier<Employee> sup = () -> new Employee(); Supplier<Employee> sup2 = Employee::new;
} @Test
public void t6() {
Function<Integer, Employee> fun = x -> new Employee(x); Function<Integer, Employee> fun1 = Employee::new;
}

下一步: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. BFS经典面试题——C++版

    文章目录 蛇梯棋 单词接龙 青蛙过河 蛇梯棋 N x N 的棋盘 board 上,按从 1 到 N*N 的数字给方格编号,编号 从左下角开始,每一行交替方向. 例如,一块 6 x 6 大小的棋盘,编号 ...

  2. activiti版本下载

    activiti工作流历史各个版本下载地址修改版本号后在浏览器地址栏回车即可 例如: https://github.com/Activiti/Activiti/releases/download/ac ...

  3. hdu 1394 线段树计算逆序数

    线段树计算逆序数的原理: 用线段树来统计已插入的数的个数(所以要保证最大的那个数不能太大,否则数组都开不了),然后每插入一个数,就查询比插入的数大的个数,累加即可. 这个题还有一个特点就是,题目给的是 ...

  4. POJ 1082 Calendar Game 原来这题有个超简单的规律

    万能的discuss.只需要月份和天数同奇同偶即可,9月30和11月30例外 #include <iostream> #include <cstdio> using names ...

  5. C#使用FtpWebRequest 基础连接已经关闭:连接被意外关闭(The underlying connection was closed:The connection was closed unexpectedly)

    公司内部开发的winform程序使用了FtpWebRequest下载FTP服务器的文件到本地. 大多数人运行良好,由于我们是试运行逐步有人加入到平台的使用,前两天突然有个别机器无法连接FTP服务器报出 ...

  6. SonarQube插件

    关于插件我本身使用不多,如果看不惯英文界面,那么就先装个中文插件吧. 或者上微软的官方网站进行下载 将下载的插件上传到自己的sonarqube的服务的机器上,放置插件目录下,重启sonarqube即可 ...

  7. Java:Java实例化(new)过程

    实例化过程(new) 1.首先去JVM 的方法区中区寻找类的class对象,如果能找到,则按照定义生成对象,找不到 >>如下2.所示 2.加载类定义:类加载器(classLoader)寻找 ...

  8. 个人博客开发之blog-api项目统一结果集api封装

    前言 由于返回json api 格式接口,所以我们需要通过java bean封装一个统一数据返回格式,便于和前端约定交互, 状态码枚举ResultCode package cn.soboys.core ...

  9. java基础---集合(2)

    一. Set 集合 java.util.Set集合是Collection集合的子集合,与List集合平级.该集合中元素没有先后放入次序,且不允许重复. 存储的数据在底层数组中并非按照数组索引的顺序添加 ...

  10. 7.Java数组

    一.数组概念(最简单的数据结构) 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问 ...