一、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. Spring Boot 2.x基础教程:使用Redis的发布订阅功能

    通过前面一篇集中式缓存的使用教程,我们已经了解了Redis的核心功能:作为K.V存储的高性能缓存. 接下来我们会分几篇来继续讲讲Redis的一些其他强大用法!如果你对此感兴趣,一定要关注收藏我哦! 发 ...

  2. CCF CSP认证考试在线评测系统

    关于 CCF CSP 认证考试在线评测系统 CCF CSP 认证考试简介 CCF 是中国计算机学会的简称.CCF 计算机软件能力认证(简称 CCF CSP 认证考试)是 CCF 于 2014 年推出, ...

  3. 8、基本数据类型(dict)

    8.1.字典: 1.字典元素用大括号括起来,用逗号分割每个元素,字典元素是"key:value"的形式 dic = { "k1": 'v1', #键值对 &qu ...

  4. 从零玩转人脸识别之RGB人脸活体检测

    从零玩转RGB人脸活体检测 前言 本期教程人脸识别第三方平台为虹软科技,本文章讲解的是人脸识别RGB活体追踪技术,免费的功能很多可以自行搭配,希望在你看完本章课程有所收获. ArcFace 离线SDK ...

  5. 接口自动化框架搭建Unittes+HTMLTestRunner

    本次主要尝试搭建接口自动化框架,基于 unittest+HTMLTestRunner 框架主要模块: config: 存放配置文件 lib: 封装了一些接口前置函数:处理各种事物 log: 存放生成的 ...

  6. 关于SOA和AOP

    SOA:面向服务的架构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.C/S端框架有WPF,服务端应用程序有WCF.asp.net web ...

  7. libcurl库(C++)快速使用

    ---恢复内容开始--- libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议.libcurl同样支 ...

  8. chown、chgrp 改变所有者、所属组

    chown [option] [所有者][:[所属组]] file... chown指定文件的拥有者或者所属组,可以通过用户名或者用户id.组名.组id来修改,同时可以修改多个文件,文件以空格分割,支 ...

  9. C语言:赋值

    #include <stdio.h> //=赋值运算符 //具有方向性,只能将赋值号右边的表达式的值给左边的变量 //赋值语句具有计算功能,赋值号右边可以是常量,变量或表达式都可以 //赋 ...

  10. Redis学习——简介

    一.Redis简介 Redis是一种基于键值对(key-value)的NoSQL数据库,与很多键值对数据库不同的是,Redis中的值可以是由string(字符串).hash(哈希).list(列表). ...