java函数接口和方法引用
目录
四大核心函数式接口
自定义函数式接口
方法引用
对象::实例方法
类::静态方法名字
类::实例方法名字
构造器引用 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函数接口和方法引用相关推荐
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- Lambda表达式接口更新方法引用函数式接口Stream流
Lambda表达式&接口更新&方法引用&函数式接口&Stream流 Lambda 1.程序启动三种不同的表现形式 2.Lambda表达式的标准格式 3.练习 Lambd ...
- Java 9 接口私有方法
Java 9 接口私有方法 Java 9已经发布,并且已经发生了很多变化.今天我们将研究接口中Java 9私有方法的变化. 目录[ 隐藏 ] 1接口中的Java 9私有方法 1.1 Java 7接口 ...
- java定义接口的方法_java定义接口的方法
java定义接口的方法 发布时间:2020-06-28 13:50:49 来源:亿速云 阅读:103 作者:Leah 本篇文章为大家展示了java定义接口的方法,代码简明扼要并且容易理解,绝对能使你眼 ...
- Java 8 中的方法引用,轻松减少代码量,提升可读性!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1. 引言 Java8中最受广大开发中喜欢的变化之一是因为 ...
- 函数式接口、方法引用
概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口. 函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可以适用于Lambda使用的接 ...
- Java基础 Stream流方法引用异常文件
Stream流 引例 需求:按照下面要求完成集合的创建和遍历 创建一个集合,存储多个字符串元素 1. 把所有以"曹"开头的元素存储到新集合中 2. 把曹开头,长度为3的元素存储到新 ...
- Java learn lambda的方法引用
lambda 的方法引用 实质也是建立在把引用方法的代码段简写成lambda表达式 分为以下几种: 1.引用静态方法 首先得有个静态方法 写成静态方法是因为 main主方法用类名调用时只会调用静态方法 ...
- scala特质 对比java的接口 使用方法
6.7 特质(Trait) Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明. Sca ...
最新文章
- 常用的数据结构-队列
- Cisco路由器命令基础篇
- Tomcat关闭日志catalina.out
- 详解Linux Initrd
- Python 的字符串转int
- Hadoop2调优(一):如何控制job的map任务和reduce任务的数量
- 笨办法学C 练习6:变量类型
- Zookeeper基础常用操作以及ACL权限
- 推荐几个单细胞数据分享和展示平台 | 短视频演示
- 返回0-9直接的随机数
- linux系统用rpm安装vsftpd,linux安装vsftpd和vsftpd配置步骤
- 深入解读Redis之数据类型解析-SDS
- 安卓Web Service实现天气预报功能
- 简单的封装知识 RDL,TSV, Bump,Wafer
- 文档化Python代码完全指南(翻译)
- 英科学家用扫描技术成功读取大脑记忆
- 华为电脑如何投屏到电视linux,华为mate10/mate10pro怎么投屏至电视或电脑上面?
- 机器人中的数值优化|【一】数值优化基础
- [导入]推荐一个好网站
- 摩根大通银行被黑客攻克, ATM机/网银危在旦夕,winxp退市灾难来临了