目录

四大核心函数式接口

自定义函数式接口

方法引用

对象::实例方法

类::静态方法名字

类::实例方法名字

构造器引用 class::new

数组引用 数组::new


四大核心函数式接口

概念:有且只有一个抽象方法的接口,但可以有默认方法,和静态方法

@FunctionalInterface 用于检查是否是一个函数接口,同时javadoc也会包含一条声名,说明这个接口是一个函数式的接口

主要有四个:Function Predicate Customer  Supplier

函数式接口: 表示接受一个参数并产生结果的函数 Function 方法:apply

源码:

举例:

 public static void main(String[] args) {
//        输入一个返回一个Function<Integer, String> function = new Function<Integer, String>() {@Overridepublic String apply(Integer integer) {return String.valueOf(integer+1);}};
//        进去的整型,返回的是字符串Function<Integer, String> f1=(a)->{return String.valueOf(a+1);};System.out.println(f1.apply(2));}

断定型接口:Predicate 方法:test

源码:

举例:

        Predicate<Integer> p = new Predicate<Integer>() {@Overridepublic boolean test(Integer integer) {if (integer==3){return true;}else {return false;}}};Predicate<Integer> p1=(s)->{if (s==3){return true;}{return false;}};

消费型接口:Customer 表示接受单个不能返回源码 f方法accept

源码:

举例:

        Consumer<String> c1 = new Consumer<String>() {@Overridepublic void accept(String o) {System.out.println("accept输出"+o);}};
//        抽象类类和接口不可以被newConsumer<String> c2 =(s)->{System.out.println(s);};c1.accept(String.valueOf(123));}

供给型接口:Supplier只有返回值

源码

举例:

        Supplier<String> s1 = new Supplier<String>() {@Overridepublic String get() {System.out.println("供给型接口");return "123";}};String s = s1.get();System.out.println(s);Supplier<String> s2 =()->{return "789";};String s3 = s2.get();System.out.println(s3);}

自定义函数式接口

使用函数接口实现加法

public class Test1 {public static void main(String[] args) {fun((a, b) -> {int i = a + b;return i;}, 33, 10);System.out.println("+++++++++++");
//        可以去掉{}fun((x,y)->x+y,12,9);}//    传入一个接口,两个参数,通过调用参数的方式来调用结果public static void fun(NumAdd n, int a, int b) {int add = n.add(a, b);System.out.println("结果为" + add);}
}//定义一个接口
@FunctionalInterface
interface NumAdd {public int add(int a, int b);
}//实现类
class number implements NumAdd {@Overridepublic int add(int a, int b) {return a + b;}
}

方法引用

补充概念:

语法糖:代码功能前后功能保持一致,同样的方法,代码更精炼。方法引用为Lambda代码更深层的表达,相当于lambda的语法糖

要求:实现接口的抽象方法的参数列表和返回值的类型,必须与方法引用的方法的参数列表和返回值类型保持一致.

操作符号 ::

五种种情况使用:

对象::实例方法

@FunctionalInterface
interface Count {int way(int a, int b);
}class DMath {
//    注意非静态方法public int add(int a, int b) {System.out.println("DMath中:a+b=" + (a + b));return a + b;}
}public class Test2 {public static void main(String[] args) {//        对象实例方法 通常写法DMath dMath = new DMath();Count e = (a, b) -> dMath.add(a, b);e.way(4,4);
//        对象::方法Count f=dMath::add;f.way(9,5);}
}

类::静态方法名字

ps:非static方法归属于对象        static方法归属于类

@FunctionalInterface
interface Count{int way(int a,int b);
}
class DMath{
//    静态方法名字public static int add(int a,int b){System.out.println("DMath中:a+b="+(a+b));return a+b;}
}
public class Test2 {public static void main(String[] args) {
//        重写了way中的方法,但调用的是DMath中的方法Count c=(a,b)->DMath.add(a,b);c.way(1,2);
//        类::方法Count d=DMath::add;d.way(9,1);}
}

结果:

类::实例方法名字

1.当对象调用方法的时候,有一个参数是函数式接口,
  2.函数式接口方法中的参数的第一个为调用者的所属类,就可以引用方法

3.可以引用调者类中定义的,不包含函数式接口第一个的参数方法

public class Test6 {public static void main(String[] args) {
//        原lambda表达式OneClass1 oneClass1 = new OneClass1();oneClass1.a = 10;InteaFace inteaFace = (a, b) -> oneClass1.add(b);System.out.println(inteaFace.way(3, 5));//类::实例方法OneClass1 oneClass2 = new OneClass1();oneClass2.a = 9;int startadd = oneClass2.startadd(OneClass1::add, 5);System.out.println(startadd);}
}@FunctionalInterface
interface InteaFace<T> {int way(T a, int b);
}class OneClass1 {int a;public int add(int b) {return this.a + b;}public int startadd(InteaFace<OneClass1> a, int b) {return a.way(this, b);}
}

构造器引用 class::new

public class Test4 {public static void main(String[] args) {InFac inFac=(a)->new TargetClass();inFac.getTargetClass("a");}
}
@FunctionalInterface
interface InFac {//    必须是类的构造方法
//    有参构造TargetClass getTargetClass(String a);
//    无参构造
//    TargetClass getTargetClass();
}class TargetClass {private String str;public TargetClass() {str = "default";System.out.println("无参构造方法:"+str);}public TargetClass(String str) {this.str = str;System.out.println("无参构造方法:"+str);}
}

数组引用 数组::new

public class Test5 {public static void main(String[] args) {TArray<int[]> tArray=int[]::new;int[] array = tArray.getArray(10);System.out.println(array.length);}
}
@FunctionalInterface
interface TArray<T>{
//    因为数组的长度固定,这里必须定义长度T getArray(int s);
}

java函数接口和方法引用相关推荐

  1. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  2. Lambda表达式接口更新方法引用函数式接口Stream流

    Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...

  3. Java 9 接口私有方法

    Java 9 接口私有方法 Java 9已经发布,并且已经发生了很多变化.今天我们将研究接口中Java 9私有方法的变化. 目录[ 隐藏 ] 1接口中的Java 9私有方法 1.1 Java 7接口 ...

  4. java定义接口的方法_java定义接口的方法

    java定义接口的方法 发布时间:2020-06-28 13:50:49 来源:亿速云 阅读:103 作者:Leah 本篇文章为大家展示了java定义接口的方法,代码简明扼要并且容易理解,绝对能使你眼 ...

  5. Java 8 中的方法引用,轻松减少代码量,提升可读性!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 引言 Java8中最受广大开发中喜欢的变化之一是因为 ...

  6. 函数式接口、方法引用

    概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接 ...

  7. Java基础 Stream流方法引用异常文件

    Stream流 引例 需求:按照下面要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 1. 把所有以"曹"开头的元素存储到新集合中 2. 把曹开头,长度为3的元素存储到新 ...

  8. Java learn lambda的方法引用

    lambda 的方法引用 实质也是建立在把引用方法的代码段简写成lambda表达式 分为以下几种: 1.引用静态方法 首先得有个静态方法 写成静态方法是因为 main主方法用类名调用时只会调用静态方法 ...

  9. scala特质 对比java的接口 使用方法

    6.7 特质(Trait) Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明. Sca ...

最新文章

  1. 常用的数据结构-队列
  2. Cisco路由器命令基础篇
  3. Tomcat关闭日志catalina.out
  4. 详解Linux Initrd
  5. Python 的字符串转int
  6. Hadoop2调优(一):如何控制job的map任务和reduce任务的数量
  7. 笨办法学C 练习6:变量类型
  8. Zookeeper基础常用操作以及ACL权限
  9. 推荐几个单细胞数据分享和展示平台 | 短视频演示
  10. 返回0-9直接的随机数
  11. linux系统用rpm安装vsftpd,linux安装vsftpd和vsftpd配置步骤
  12. 深入解读Redis之数据类型解析-SDS
  13. 安卓Web Service实现天气预报功能
  14. 简单的封装知识 RDL,TSV, Bump,Wafer
  15. 文档化Python代码完全指南(翻译)
  16. 英科学家用扫描技术成功读取大脑记忆
  17. 华为电脑如何投屏到电视linux,华为mate10/mate10pro怎么投屏至电视或电脑上面?
  18. 机器人中的数值优化|【一】数值优化基础
  19. [导入]推荐一个好网站
  20. 摩根大通银行被黑客攻克, ATM机/网银危在旦夕,winxp退市灾难来临了

热门文章

  1. 从开始学习爬虫到真正赚钱只用了一个月——一个普通专科生的逆袭之路
  2. 【原创】suhunbsp;视频
  3. Unsatisfied dependency expressed through field
  4. 全志Android A10技术论坛推广
  5. ModelScope--人像卡通化、人像美肤
  6. Hadoop作业调度
  7. S7-200SMART案例分析——运动控制编程三轴控制(一)
  8. STM32 OSPI四线读取 SST26VF064B ID
  9. 2023江西师范大学计算机考研信息汇总
  10. 2PSK,2DPSK编码