函数式接口

  • 函数式接口:有且仅有一个抽象方法的接口。
  • 使用@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>: 输入是 TU 类型的数据,无返回值
  • BiPredicate<T, U>: 输入是 TU 类型的数据,返回 boolean 类型。
  • BiFunction<T, U, R>: 输入是 TU 类型的数据,返回 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常见函数式接口总结的更多相关文章

  1. java8的函数式接口

    函数式接口 就是在java8里允许你为一个接口(只有一个实现的,声明为FunctionalInterface注解的)实现一个匿名的对象,大叔感觉它与.net平台的委托很类似,一个方法里允许你接收一个方 ...

  2. JAVA8之函数式接口

    由于JDK8已经发布一段时间了,也开始逐渐稳定,未来使用JAVA语言开发的系统会逐渐升级到JDK8,因为为了以后工作需要,我们有必要了解JAVA8的一些新的特性.JAVA8相对JAVA7最重要的一个突 ...

  3. [译]Java8的函数式接口

    Java8引入了 java.util.function 包,他包含了函数式接口,具体的描述在以下api说明文档中: 函数式接口为lambda表达式和方法引用提供目标类型.每个函数式接口有一个单独的抽象 ...

  4. Java8 Functional(函数式接口)

    Functional 函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口. 你可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即 ...

  5. java8 常用函数式接口

    public static void main(String[] args) { // TODO Auto-generated method stub //函数式接口 Function<Inte ...

  6. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

  7. java8学习之Supplier与函数式接口总结

    Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...

  8. java代码之美(14)---Java8 函数式接口

    Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...

  9. java代码(14) --Java8函数式接口

    Java8函数式接口 之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁 一.概 ...

  10. Java8的新特性--函数式接口

    目录 函数式接口 什么是函数式接口 函数式接口的使用 Java8内置的四大核心函数式接口 一.Consumer:消费型接口(void accept(T t)) 二.Supplier:供给型接口(T g ...

随机推荐

  1. 后端框架的学习----mybatis框架(3、配置解析)

    3.配置解析 1.核心配置文件 2.环境配置(environment) 3.属性(properties) 可以通过properties属性来实现引用配置文件 这些属性可以在外部进行配置,并可以进行动态 ...

  2. 在vue中_this和this的区别

    _this只是一个变量名,this代表父函数,如果在子函数还用this,this的指 向就变成子函数了,_this就是用来存储指向的 普通函数中的this表示调用此函数时的对象,箭头函数里面的this ...

  3. python基础之数据类型总结

    一.列表 1.作用:列表主要用于存储多个数据. 2.空列表表示:li=[]或者li=list() 3.列表的索引和切片:同字符串的索引和切片,索引超出范围报错,切片超出范围不报错. list3 = [ ...

  4. 【SSM】学习笔记(二)——SpringMVC入门

    原视频链接:https://www.bilibili.com/video/BV1Fi4y1S7ix/?p=43&spm_id_from=pageDriver&vd_source=8ae ...

  5. 【JavaWeb】学习笔记——Tomcat集成

    简介 Tomcat是基于Java的一个开放源代码.运行servlet和JSP Web应用的Web应用软件容器,又称servlet容器 安装 官方网站:https://tomcat.apache.org ...

  6. SpringBoot 阶段测试 1

    SpringBoot 阶段测试 1 目录 SpringBoot 阶段测试 1 1.使用JDK8新语法完成下列集合练习: 1.1 List中有1,2,3,4,5,6,7,8,9几个元素要求; (1) 将 ...

  7. php注解使用示例

    今天看到php注解的介绍文章很感兴趣,动手实际试了试挺好玩,写这篇文章记录下 php从8开始支持原生注解功能了,我们可以写个小的例子看看注解怎么玩.   先确定我们的任务目标 1.编写一个注解类rou ...

  8. Python标准库之 xml.etree.ElementTree

    Element类型是一种灵活的容器对象,用于在内存中存储结构化数据. 每个element对象都具有以下属性: 1. tag:string对象,表示数据代表的种类. 2. attrib:dictiona ...

  9. git的介绍、git的功能特性、git工作流程、git 过滤文件、git多分支管理、远程仓库、把路飞项目传到远程仓库(非空的)、ssh链接远程仓库,协同开发

    Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. [1] 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码 ...

  10. php zip下载附件到压缩包并浏览器下载

    /** * 下载图片并生成压缩包 * @param $arr 资源数组 * @return string */ function downloadZipImg($arr) {if(is_array($ ...