Java8新特性-四大核心函数式接口

总结一下java8中的新特性 内置的四大核心函数式接口

函数式接口在java中是指: 有且仅有一个抽象方法的接口

函数式接口,即适用于函数式编程场景的接口。而java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。

@FunctionalInterface标注在一个接口上,说明这个接口是一个函数式接口。

那么关于函数式接口,有如下特点:

  • 有且只有一个抽象方法
  • 可以有多个静态方法
  • 可以有多个default方法(默认方法)
  • 可以有多个Object的public的抽象方法
@FunctionalInterface
public interface Consumer {
    void accept(T t);

    default Consumer andThen(Consumer after) {
        Objects.requireNonNull(after);
        return (T t) -> { accept(t); after.accept(t); };
    }
}

Consumer有参数,无返回值

Consumer有两个方法:accept()抽象方法, andThen()非抽象方法

使用示例:

//Consumer 消费型接口 :
@Test
public void test1(){
    happy(10000, (m) -> System.out.println("消费:" + m + "元"));
}

public void happy(double money, Consumer con){
    con.accept(money);
}
@FunctionalInterface
public interface Supplier {
    // 无输入参数,提供一个创建好的对象,即结果
    T get();
}

使用示例

//Supplier 供给型接口 :
@Test
public void test2(){
    List numList = getNumList(10, () -> (int)(Math.random() * 100));

    for (Integer num : numList) {
        System.out.println(num);
    }
}
//需求:产生指定个数的整数,并放入集合中
public List getNumList(int num, Supplier sup){
    List list = new ArrayList<>();

    for (int i = 0; i < num; i++) {
        Integer n = sup.get();
        list.add(n);
    }

    return list;
}
@FunctionalInterface
public interface Function {
    // 我给你一个参数,你帮我处理一下,给我返回另一个参数。
    R apply(T t);

    // 返回一个组合函数,首先将入参应用到before函数,再将before函数结果应用到该函数中
    default  Function compose(Function before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }

    // 返回一个组合函数,该函数结果应用到after函数中
    default  Function andThen(Function after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }

    // 返回输入参数
    static  Function identity() {
        return t -> t;
    }
}

使用示例:

//Function 函数型接口:
@Test
public void test3(){
    String newStr = strHandler("\t\t\t 这是一个字符串", (str) -> str.trim());
    System.out.println(newStr);

    String subStr = strHandler("这是一个字符串", (str) -> str.substring(2, 5));
    System.out.println(subStr);
}

//需求:用于处理字符串
public String strHandler(String str, Function fun){
    return fun.apply(str);
}

源码:

@FunctionalInterface
public interface Predicate {
    // 给一个参数T,返回boolean类型的结果
    boolean test(T t);

    default Predicate and(Predicate other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate negate() {
        return (t) -> !test(t);
    }

    default Predicate or(Predicate other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }

    static  Predicate isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

Predicate默认实现的三个重要方法and,or和negate,这三个方法对应了java的三个连接符号&&、||和!,isEqual这个方法的返回类型也是Predicate,所以我们也可以把它作为函数式接口进行使用。我们可以当做==操作符来使用。

使用示例:

//Predicate 断言型接口:
@Test
public void test4(){
    List list = Arrays.asList("Hello", "atguigu", "Lambda", "www", "ok");
    List strList = filterStr(list, (s) -> s.length() > 3);

    for (String str : strList) {
        System.out.println(str);
    }
}

//需求:将满足条件的字符串,放入集合中
public List filterStr(List list, Predicate pre){
    List strList = new ArrayList<>();

    for (String str : list) {
        if(pre.test(str)){
            strList.add(str);
        }
    }

    return strList;
}

Original: https://www.cnblogs.com/mrxccc/p/16504729.html
Author: 狮子挽歌丿
Title: Java8新特性-四大核心函数式接口

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588660/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JavaWeb入门

    1.Web概念概述 JavaWeb:使用Java语言开发基于互联网的项目 1.1 软件架构 C/S:Client/Server 客户端、服务器端 在用户本地有一个客户端程序,在远程…

    Java 2023年6月6日
    075
  • Java maven构建命令使用总结

    实践环境 Apache Maven 3.0.5 (Red Hat 3.0.5-17) maven构建生命周期 学习Maven构建命令之前,我们不烦先简单了解下Maven构建生命周期…

    Java 2023年6月16日
    062
  • 自定义注解获取当前登录用户

    在做项目的时候,我们经常会用到当前登录的用户,获取这个用户相关的信息,总是用User user = session.getAttribute(“user”)…

    Java 2023年6月16日
    0138
  • 用Java模拟实现对系统文件以目录的拷贝功能

    要用Java对单个文件拷贝的话,其实思路很简单,循环读取被拷贝文件,放入byte数组,然后写入目标文件。当然我们也可以借助现有的类去完成,如 InputStream中的 trans…

    Java 2023年6月7日
    072
  • NoteOfMySQL-13-事务与并发控制

    一、事务简介 存储引擎如InnoDB、BDB才支持事务处理。 每个事务(transaction)的处理必须满足ACID原则: 原子性(Atomicity): 原子性指每个事务都必须…

    Java 2023年6月5日
    071
  • Java基础

    环境 并非所有的计算机都可以开发java程序,java程序的开发与运行需要专门的环境。 因为java语言的程序是运行在java所专有的系统中。 要运行java程序我们需要在操作系统…

    Java 2023年6月7日
    0125
  • spring cloud 服务链路追踪 skywalking 6.1

    随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言…

    Java 2023年6月16日
    0176
  • springBoot跨域注解@CrossOrigin

    方法一(此方法maven install需jdk1.8版本+): Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和…

    Java 2023年5月30日
    074
  • java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class L…

    Java 2023年5月29日
    073
  • OptaPlanner实用技术-批量规划和实时规划(1)

    在日常的规划应用中,无论是APS,VRP还是排班场景,有两个极其常见的需求,分别是批量规划和实时规划。下面我们对这两种情况作更深入探讨。 顾名思义,该功能是指规划程序可批量地、且行…

    Java 2023年6月16日
    068
  • jQuery之过滤选择器

    过滤选择器 1.基本选择器 2.内容选择器 3.可见性选择器 4.子元素过滤器 过滤选择器简称:过滤器。它其实也是一种选择器,而这种选择器类似于CSS3(http://t.mb5u…

    Java 2023年6月6日
    091
  • 微服务架构的基础框架选择:Spring Cloud还是Dubbo?

    https://zhuanlan.zhihu.com/p/25450681?refer=dreawer 最近一段时间不论互联网还是传统行业,凡是涉及信息技术范畴的圈子几乎都在讨论微…

    Java 2023年5月30日
    064
  • 类加载器(JVM)

    一.JVM概述 JVM是java是二进制字节码的运行环境 特点: 一次编译,到处运行(跨平台) 自动内存管理 自动垃圾回收功能 常见的JVM Sun Classic VM:世界上第…

    Java 2023年6月7日
    0270
  • Maven 依赖调解源码解析(六):dependencyManagement 版本锁定

    我们在根模块 mavenDependencyDemo 中,用 dependencyManagement 的形式直接指定 X 的版本为 2.0。同时,A 依赖 C,而 C 依赖了 X…

    Java 2023年6月16日
    081
  • JAVA入门基础_从零开始的培训_MYSQL高级

    第1章 Linux下MySQL的安装与使用 Linux下MYSQL的卸载 安装MYSQL之前的准备步骤 正式安装 检查/tmp临时目录权限 安装前检查依赖并卸载mariadb 按照…

    Java 2023年6月9日
    054
  • SpringBoot 上下文获取注入的Bean

    import org.springframework.beans.BeansException; import org.springframework.context.Applic…

    Java 2023年5月30日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球