/*** 方法引用格式:

* 双冒号:: 引用运算符,它所在的表达式被称为方法引用。如果Lambda表达式

* 的函数方案已经存在于某个地方的实现中,

* ===》那么可以通过双冒号来引用改方法作为Lambda表达式的代替者*/

例子:

public classDemo01Print {private static voidprintString(Printable p){

p.print("quan");

}public static voidmain(String[] args) {

printString((s)->{

System.out.println(s);

});/*** 表达式的目的:打印参数传递的字符串

* 把参数s,传递给System.out对象,调用out对象的pringln方法进行输出

* System.out对象已经存在

* pringln方法已经存在

* =====》可以使用方法引用来优化表达式

* 就是使用system.out方法直接引用(调用)pringln方法。*/printString(System.out::println);

}

结果输出:

quan

quan

通过对象名引用成员方法

最常见的一种用法,其实就是上面的做法:

/*** 通过对象名引用成员方法

* 前提:

* 对象名存在,方法名存在

* 就可以使用对象名来引用成员方法*/

例子:

1先创建对象类

public classMethodRefObject {public voidpringUpperCaseString(String s){

System.out.println(s.toUpperCase());

}

}

2创建函数式接口

@FunctionalInterfacepublic interfacePrintable {//定义字符串的抽象方法

voidprint(String s);

}

3测试方法:

public classDemo01MethodRefObject {private static voidpringString(Printable p){

p.print("quan");

}public static voidmain(String[] args) {

pringString((s)->{//创建MethodRefObject对象

MethodRefObject obj = newMethodRefObject();//调用对象里面的成员方法pringUpperCaseString把字符//串按照大写输出

obj.pringUpperCaseString(s);

});//使用方法引用优化,先创建MethodObject对象

MethodRefObject obj = newMethodRefObject();

pringString(obj::pringUpperCaseString);

}

}/*** re:

* QUAN

* QUAN

**/

通过类名称引用静态方法

/*** 通过类名引用静态承焰方法

* 前提:

* 类已经存在,静态成员方法存在

**/

例子:

public classDemo01StaticMethodReference {//定义一个方法,方法的参数传递要计算的整数和函数式接口Calcable

private static int method(intnum,Calcable c){returnc.calAbs(num);

}public static voidmain(String[] args) {//调用method方法

int i =method(-10,(n)->{//计算绝对值,使用的是Math类当中的静态方法abs

returnMath.abs(n);

});

System.out.println(i);/***使用方法引用优化Lambda表达式

* Math类存在

* abs计算绝对值静态方法存在*/

int i1 = method(-10,Math::abs);

System.out.println(i1);

}

}

通过supper引用父类的成员方法

存在子父关系

创建一个父类

//父类

public classHuman {public voidsayHello(){

System.out.println("say hello");

}

}

创建一个函数式接口

@FunctionalInterfacepublic interfaceGreetable {voidgreet();

}

创建一个子类:

public class Man extendsHuman{

@Overridepublic voidsayHello() {

System.out.println("hello,I'm Man");

}public voidmethod(Greetable g){

g.greet();

}public voidshow(){

method(()->{//创建父类

Human human = newHuman();

human.sayHello();

});/*** 存在子夫类关系,存在super关键字,代表父类

* 直接通过super调用父类成员方法*/method(()->{super.sayHello();

});/*** 通过super引用类的成员方法*/method(super::sayHello);

}public static voidmain(String[] args) {newMan().show();newMan().sayHello();

}

}

结果:

say hello

say hello

say hello

hello,I'm Man

通过this引用成员方法

this代表当前对象,如果需要引用的方法就是当前类中的成员方法。

可以使用this::成员方法来使用方法引用

定义一个接口

@FunctionalInterfacepublic interfaceRichable {voidbuy();

}

/*** 通过this引用奔雷成员方法*/

public classHusbard {public voidbuyHome(){

System.out.println("买房子");

}public voidmarry(Richable r){

r.buy();

}public voidsoHappy(){

marry(()->{//使用this成员方法

this.buyHome();

});/*** 使用方法引用优化Lambda表达式*/marry(this::buyHome);

}public static voidmain(String[] args) {newHusbard().soHappy();

}

}

类的构造器引用

构造器和类名完全一致,所以使用方式为:类名称::new的格式表示。

定义一个函数式接口

/*** 定义一个创建Person对象的函数式接口*/@FunctionalInterfacepublic interfacePersonBuilder {//根据姓名创建Person对象返回

Person builderPerson(String name);

}

一个要被创建的类Person

public classPerson {privateString name;publicPerson() {

}publicPerson(String name) {this.name =name;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

}

/*** 类的构造器引用*/

public classDemo {public static voidprintName(String name,PersonBuilder builder){

Person person=builder.builderPerson(name);

System.out.println(person.getName());

}public static voidmain(String[] args) {

printName("quan",(name)->{return newPerson(name);

});/*** 使用方法引用优化lambda表达*/printName("quan2",Person::new);

}

}//re:quan//quan2

数组构造器的引用

数组是Object的子类对象,同样具有构造器,但是语法不太一样

/*** 数组的构造器引用

* 数组::new

* 例子:int[]::new*/

创建一个接口

//创建数组的函数式接口

@FunctionalInterfacepublic interfaceArrayBuilder {//返回一个给定长度的int类型数组

int[] builderArray(intlength);

}

public classDemo1 {public static int[] createArray(intlength,ArrayBuilder ab){returnab.builderArray(length);

}public static voidmain(String[] args) {//调用create方法,传递数组长度和表达式

int[] lenint = createArray(12,(len)->{return new int[len];

});

System.out.println(lenint.length);//优化,int[]就是数组的构造函数名字

int[] lenint2 = createArray(15,int[]::new);

System.out.println(lenint2.length);

}

}//re:12//15

java uppercase方法_java-方法引用相关推荐

  1. java 方法_Java 方法 | 菜鸟教程

    Java 方法 在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢? println() 是一个方法. System 是系统类. out 是标准输出对象. 这句话 ...

  2. java 返回值_Java方法返回值详解

    Java方法返回值详解 每个方法都是为了完成某个特定的功能,例如:登录功能.求和功能等,既然是功能,那么当这个功能完成之后,大多数情况下都会有一个结果的,比如,登录成功了或者失败了(true/fals ...

  3. java 默认参数_Java 方法的参数可以有默认值吗?

    Java 方法的参数可以有默认值吗? 例如 void method(String p1, int p2, bool p3=false); 回答 Java不支持这种特性, 如果你真的有需求,你可以 通过 ...

  4. java实验楼使用说明_Java 方法

    Java 方法 一.实验介绍 1.1 实验内容 本实验将学习Java方法的定义与语法规则.方法重载以及参数与返回值的相关内容. 1.2 实验知识点 方法的定义 方法重载 参数与返回值 1.3 实验环境 ...

  5. java 面向对象 重载_Java方法重载

    在同一类中具有多个具有相同名称的方法称为方法重载.类中具有相同名称的方法可以是声明的方法,继承的方法或两者的组合. 重载方法必须具有不同数量的参数,不同类型的参数或两者.方法的返回类型,访问级别和th ...

  6. java方法_Java方法

    java方法 Java is an Object Oriented Programming language. Java Methods are defined in the class and th ...

  7. java永久区_Java方法区和永久代

    目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9. JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM发明的用于其Websph ...

  8. java 静态绑定原理_Java方法的静态绑定与动态绑定讲解

    一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定.绑定分为静态绑定(前期绑定)和动态绑定(后期绑定). 二:静态绑定 静态绑定(前期绑定)是指:在程序运行前就已经知道方法是属于那个类的, ...

  9. java传递实例_Java方法的参数传递机制实例详解

    本文实例讲述了Java方法的参数传递机制.分享给大家供大家参考,具体如下: 参数传递机制 对于程序设计语言来说,一般方法(函数)的参数传递有两种:按值传递和按引用传递. 按值传递意味着当将一个参数传递 ...

  10. java 可变参数方法_Java方法中的参数太多,第7部分:可变状态

    java 可变参数方法 在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要. 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最 ...

最新文章

  1. iOS UICollectionView实现瀑布流(3)
  2. 栈、堆、方法区之间的关系
  3. 固态硬盘市场或将提前爆发
  4. python实现序列数据预处理_Python笔记:序列处理函数
  5. SSM框架——使用MyBatis Generator自动创建代码
  6. 虚拟机 java 开发_深入浅出 Java 虚拟机 · 通往高级 Java 开发的必经之路
  7. UI设计配色专辑素材|简易完成色彩协调性!
  8. iOS底层探索之KVO(四)—自定义KVO
  9. 调用百度api 生成短网址
  10. 跑跑卡丁车显示服务器断开连接,win10系统电脑玩跑跑卡丁车出现与服务器断开连接的详细技巧...
  11. 如何禁用Citrix Receiver硬件加速功能
  12. 【C++小游戏】推箱子代码+详解
  13. TCP/IP——从wireshark看TCP(一)
  14. 中国计算机软件法,计算机软件专利申请中国快律法务攻略.pdf
  15. icc 颜色 c语言,浅析颜色在icc中四种不同的转换方式
  16. 群控代理、2016年很火的云豹群控代理
  17. QPS和TPS的区别
  18. 手把手教你用图灵机器人做微信公众号自动回复助手
  19. 接口访问报错:301 Moved Permanently
  20. 【Unity】入门学习笔记180604——游戏动画设计(1)——概述/精灵对象动画

热门文章

  1. 153是一个非常特殊的数,它等于它的每位数字的立方和
  2. 【C语言练习】将100~200之间的素数输出
  3. pic1路AD转换c语言,pic单片机的ad转换(实例解析)
  4. Linux内核地址空间为什么1GB,为什么Windows为其系统地址空间预留1Gb(或2 Gb)?
  5. Django报错:ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。...
  6. HDU 5919 Sequence II 主席树
  7. java(eclipse)和数据库(mysql)的连接
  8. 设计模式(七)适配器模式(Adapter Pattern)
  9. XAML和VBA 7规范发布
  10. CSS实现的阴影效果