Java8常见函数式接口总结
函数式接口
- 函数式接口:有且仅有一个抽象方法的接口。
- 使用
@FunctionalInterface注解来标记。如果接口不是函数式接口就会编译出错 - 满足条件的接口即使不加上注解,那也是函数式接口
- 函数式接口可以作为方法的参数
public static void main(String[] args) {
// 1. 匿名类作为参数
startThread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
// 2. 函数式接口作为参数
startThread(() -> System.out.println(Thread.currentThread().getName()));
} public static void startThread(Runnable r){
new Thread(r).start();
}
- 函数式接口可以作为方法的返回值
public static void main(String[] args) {
// 函数式接口作为返回值
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bbbbb");
list.add("c"); System.out.println(list);
Collections.sort(list, getComparator());
System.out.println(list);
} public static Comparator<String> getComparator(){
// 1. 直接新建匿名对象
// Comparator<String> comp = new Comparator<String>() {
// @Override
// public int compare(String o1, String o2) {
// return o1.length() - o2.length();
// }
// };
// return comp; // 2. 使用lambda
Comparator<String> comp = (o1, o2) -> o1.length() - o2.length();
return comp;
}
常用的函数式接口
Supplier<T>: 没有输入,返回一个T类型的结果。Consumer<T>: 输入一个T类型参数,没有返回值。Predicate<T>: 输入一个T类型参数,返回boolean。Function<T, R>: 输入一个T类型参数,返回R类型参数。
对应的还有两个参数的版本:
BiConsumer<T, U>: 输入是T和U类型的数据,无返回值BiPredicate<T, U>: 输入是T和U类型的数据,返回boolean类型。BiFunction<T, U, R>: 输入是T和U类型的数据,返回R类型。
Function<T, R> 接口
@FunctionalInterface
public interface Function<T, R> {
// 输入T类型参数,输出R类型结果
R apply(T t);
// 返回一个新的Function。先执行before,再执行当前
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
// 返回一个新的Function。限制性当前,再执行after
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
Function<String, String> func1 = (x) -> x + "1";
Function<String, String> func2 = (x) -> x + "2";
System.out.println(func1.apply("0")); // 01
System.out.println(func1.andThen(func2).apply("0")); // 012
System.out.println(func1.compose(func2).apply("0")); // 021
Consumer<T> 接口
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
Consumer<StringBuilder> consumer = (x) -> {
x.append("1");
};
StringBuilder str = new StringBuilder("0");
consumer.accept(str);
System.out.println(str.toString()); // 01
Supplier<T> 接口
@FunctionalInterface
public interface Supplier<T> {
// 获取一个元素
T get();
}
lambda可捕获局部变量
// Suplier
Supplier<String> supplier = () -> "aaa";
System.out.println(supplier.get());
// 使用外部变量
int arr [] = {20, 40, 30, 10};
Supplier<Integer> getMax = ()-> {
int max_ = arr[0];
for (int item : arr){
if (item > max_) max_ = item;
}
return max_;
};
System.out.println(getMax.get());
Predicate<T> 接口
@FunctionalInterface
public interface Predicate<T> {
// 输入一个t,返回boolean
boolean test(T t);
// 与运算
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
// 取反运算
default Predicate<T> negate() {
return (t) -> !test(t);
}
// 或运算
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
// Predicate
Predicate<String> predicate = (x)-> x.contains("0");
Predicate<String> predicate2 = (x) -> x.contains("1");
System.out.println(predicate.test("0123")); // true
System.out.println(predicate.negate().test("0000")); // false
System.out.println(predicate.and(predicate2).test("0123")); // true
System.out.println(predicate.or(predicate2).test("0000")); // true
Java8常见函数式接口总结的更多相关文章
- java8的函数式接口
函数式接口 就是在java8里允许你为一个接口(只有一个实现的,声明为FunctionalInterface注解的)实现一个匿名的对象,大叔感觉它与.net平台的委托很类似,一个方法里允许你接收一个方 ...
- JAVA8之函数式接口
由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...
- [译]Java8的函数式接口
Java8引入了 java.util.function 包,他包含了函数式接口,具体的描述在以下api说明文档中: 函数式接口为lambda表达式和方法引用提供目标类型.每个函数式接口有一个单独的抽象 ...
- Java8 Functional(函数式接口)
Functional 函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口. 你可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即 ...
- java8 常用函数式接口
public static void main(String[] args) { // TODO Auto-generated method stub //函数式接口 Function<Inte ...
- 乐字节-Java8核心特性实战之函数式接口
什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...
- java8学习之Supplier与函数式接口总结
Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...
- java代码之美(14)---Java8 函数式接口
Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...
- java代码(14) --Java8函数式接口
Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...
- Java8的新特性--函数式接口
目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...
随机推荐
- ssh端口映射 解决服务器使用tensorboard的问题
有时会在服务器上使用tensorboard,然而本地无法直接访问tensorboard结果网页.这时候使用端口映射即可.比如tensorboard上占用的是 6006 端口,也就是说结果在服务器的 l ...
- Linux基础_5_文件管理
创建 touch 文件名 #创建文件 stat 文件名 #查看文件属性 touch -am 文件名 #更改文件的访问时间及修改时间 删除 rm -rf s/* #递归强制删除s目录下的所有内容(包括文 ...
- 齐博x1模板中常用的TP标签数据处理
上图是比较常用的, 而下图是比较特殊的场合,比如幻灯片可能会用到 下图使用了TP的循环标签. 上图只使用了条件判断标签 上图不存在 val="xxx" 这个参数,所以会自动循环输出 ...
- Python学习三天计划-3
面向对象 一.类的定义 1.类定义 class是关键字,表示要定义类了 类的属性,即定义在类中的变量(成员变量) 类的行为,即定义在类中的函数(成员方法) 2.对象 创建类对象的语法: class S ...
- windows和虚拟机上的Ubuntu互传文件
1.简介 本文讲述的是通过ssh登录虚拟机上的Ubuntu系统,实现互传文件 2.Ubuntu端 2.1.安装ssh sudo apt-get update sudo apt-get install ...
- Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务
本文主要介绍 Windows 环境下搭建 PostgreSQL 的主从逻辑复制,关于 PostgreSQl 的相关运维文章,网络上大多都是 Linux 环境下的操作,鲜有在 Windows 环境下配置 ...
- redis的几个优化点
1. redis读写速度慢 可以将redis单实例改为redis集群 2. redis报OOM redis内存溢出,调大redis内存:增加redis.conf中的maxmemory 的值.如果red ...
- docker构建容器时 容器内使用代理
build 容器时 使用代理 demo1 使用前 指定 env 使用后 记得 清空, 否则 会影响 使用容器 时的 网络 cat dockerfile --> FROM jenkins/jenk ...
- MySQL该使用哪种CPU架构服务器?
1. 摘要 近期,阿里云推出基于 ARM 架构的 RDS MySQL 和 RDS PostgreSQL 实例,现处于邀测阶段,阿里云宣传 ARM 架构的亮点是:在价格下降13%的基础上,平均性能 AR ...
- 嵌入式-C语言基础:二维数组的地址写法
二维数组a的有关指针: 表示形式 含义 ...