Java基础教程——方法引用
方法引用
Lambda表达式的代码,是否可以再简洁?——方法引用
对象/类名::方法名
参数都不用写明。
import java.util.function.Consumer;
public class 方法引用 {
static void printStr(Consumer<String> c, String s) {
// 借助Consumer接口,accept方法可以接收参数
c.accept(s);
}
public static void main(String[] args) {
System.out.println("------ 方法引用(关注做什么,不管怎么做)");
printStr(s -> System.out.println(s), "Lambda写法");
// 使用方法引用的前提:
// |--对象已经存在(System.out)
// |--方法也存在(println())
// |--参数是方法可接收类型(String)
printStr(System.out::println, "方法引用:连参数都不写");
}
}
------ 方法引用(关注做什么,不管怎么做)
Lambda写法
方法引用:连参数都不写
引用普通方法和静态方法
import java.util.function.Consumer;
public class 方法引用2 {
public static void main(String[] args) {
// -----------------------
String str = "Journey to the west";
printStr(s -> {
MyString ms = new MyString();
ms.printUpperCase(s);
}, str);
MyString ms = new MyString();
printStr(ms::printUpperCase, str);
System.out.println("--- 引用静态方法,直接类名::方法名");
printStr(MyString::staticPrint, "Journey to the west");
}
static void printStr(Consumer<String> p, String s) {
// 借助Consumer接口,accept方法可以接收参数
p.accept(s);
}
}
class MyString {
public void printUpperCase(String s) {
System.out.println(s.toUpperCase());
}
public static void staticPrint(String s) {
System.out.println(s.toLowerCase());
}
}
JOURNEY TO THE WEST
JOURNEY TO THE WEST
--- 引用静态方法,直接类名::方法名
journey to the west
引用父类方法(super)和自身方法(this)
import java.util.function.Consumer;
public class 方法引用3 {
public static void main(String[] args) {
new S().show();
}
}
class F {
void m(String s) {
System.out.println("父类方法:" + s);
}
}
class S extends F {
@Override
void m(String s) {
System.out.println("子类方法:" + s);
}
public void invoke(Consumer<String> c, String s) {
c.accept(s);
}
public void show() {
// Lambda表达式写法
invoke((s) -> {
F f = new F();
f.m(s);
this.m(s);
}, "Lambda表达式写法");
invoke(super::m, "引用方法,使用super::");
invoke(this::m, "引用方法,使用this::");
}
}
父类方法:Lambda表达式写法
子类方法:Lambda表达式写法
父类方法:引用方法,使用super::
子类方法:引用方法,使用this::
引用构造方法(实例化对象)
import java.util.Arrays;
import java.util.function.Function;
class Cat {
private String name;
public Cat(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class 方法引用4new {
public static void main(String[] args) {
createCat("Lambda(1)", (name) -> {
return new Cat(name);
});
createCat("Lambda(2)简化,省略{}、return、;", (name) -> new Cat(name));
createCat("方法引用:类::new", Cat::new);
// ---创建数组
createArray(10, (len) -> new Cat[len]);
createArray(10, Cat[]::new);
}
static void createCat(String name, Function<String, Cat> f) {
Cat c = f.apply(name);
System.out.println(c.getName());
}
static void createArray(Integer len, Function<Integer, Cat[]> f) {
Cat[] c = f.apply(len);
System.out.println(Arrays.toString(c));
}
}
Lambda(1)
Lambda(2)简化,省略{}、return、;
方法引用:类::new
[null, null, null, null, null, null, null, null, null, null]
[null, null, null, null, null, null, null, null, null, null]
Java基础教程——方法引用的更多相关文章
- Java基础教程(18)--继承
一.继承的概念 继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...
- Java基础教程(12)--深入理解类
一.方法的返回值 当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...
- Java基础教程:注解
Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...
- Java基础教程:面向对象编程[2]
Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...
- Java基础教程:面向对象编程[1]
Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...
- Java基础教程:面向对象编程[3]
Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...
- Java基础教程(25)--I/O
一.I/O流 I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等. 流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...
- Java基础教程:Java内存区域
Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...
- Java基础教程:垃圾回收
Java基础教程:垃圾回收 垃圾回收 垃圾回收(Garbage Collection,GC),顾名思义是释放垃圾占用的空间,防止内存泄漏.有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使 ...
随机推荐
- CPU上下文
CPU上下文 包括CPU寄存器和程序计数器(Program Counter,PC). CPU寄存器,是CPU内置的容量小.但速度极快的内存. 程序计数器,是用来存储CPU正在执行的指令位置.或者即将执 ...
- 【转】Loading PNGs with SDL_image
FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/index2. ...
- Longest common subsequence(LCS)
问题 说明该问题在生物学中的实际意义 Biological applications often need to compare the DNA of two (or more) different ...
- MySql基础(常用)
MySQL常用语句 1.查看当前所有数据库 show databases; 2.打开指定的库 use 库名; 3.查看当前库中的所有表 show tables; 4.查看其他库的表 show tabl ...
- [Luogu P1066] 2^k进制数 (组合数或DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1066 Solution 这是一道神奇的题目,我们有两种方法来处理这个问题,一种是DP,一种是组合数. 这 ...
- mkdir()和mkdirs()区别
mkdir()和mkdirs()区别如下: mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three&qu ...
- 庐山真面目之三微服务架构Consul版本实现
庐山真面目之三微服务架构Consul版本实现 一.简介 在上一篇文章<庐山真面目之二微服务架构NGINX版本实现>中,我们已经探讨了如何搭建基于Nginx 网关的微服务 ...
- lambda表达式的distinct去重
天真的我最开始以为可以写成list.distinct(x=>x.name);以为这样就可以按照name去重了,结果是不行的.这里记录下正确的用法. 1.这里是针对int集合 可以满足 #reg ...
- 第05组 Alpha冲刺 (4/6)(组长)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...
- [MIT6.006] 11. Integer Arithmetic, Karatsuba Multiplication 整型算术,Karatsuba乘法
很多人不喜欢√2的表达,他们认为它不是一个数. 一.卡塔兰数 Catalan numbers 在数方面上,有个著名的数叫卡塔兰数 Catalan numbers,它是组合数学中一个常在各种计数问题中出 ...