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),顾名思义是释放垃圾占用的空间,防止内存泄漏.有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使 ...
随机推荐
- npm ande gulp cmd
在学习前,先谈谈大致使用gulp的步骤,给读者以初步的认识.首先当然是安装nodejs,通过nodejs的npm全局安装和项目安装gulp,其次在项目里安装所需要的gulp插件,然后新建gulp的配置 ...
- MySQL全面瓦解3:数据类型介绍与分析
概述 MySQL支持很多数据类型,以便我们能在复杂的业务场景中支持各种各样的数据格式,存储适当的数据内容.我们在设计数据库时,正确的使用数据库类型对整个数据库的整洁和高效,会有很大的帮助. 目前常用的 ...
- 谈谈nginx和lvs各自的优缺点以及使用
在最开始呢,咱们先说一下什么叫负载均衡,负载均衡呢,就是将一批请求,根据请求的内容,分发到不同的后端去进行相应的处理,从而提供负载分担,主备切换等功能. ...
- SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂)
SpringBoot第五集:整合监听器/过滤器和拦截器(2020最新最易懂) 在实际开发过程中,经常会碰见一些比如系统启动初始化信息.统计在线人数.在线用户数.过滤敏/高词汇.访问权限控制(URL级别 ...
- 修改redo log 的大小
alert日志中含有大量警告信息:"Thread 1 cannot allocate new log, sequence 320xx Checkpoint not complete" ...
- c# 表达式树(一)
前言 打算整理c# 代码简化史系列,所以相关的整理一下,简单的引出一下概念. 什么是表达式树呢? 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的 ...
- fasd
基本排序算法 冒泡排序 没什么可说的, 改进方法就是加一个标志位防止有序后重复遍历. 由于需要遍历两次, 所以时间复杂度O(N^2) 传送门 --> 冒泡排序 选择排序 外层从0开始默认oute ...
- 【SpringBoot】10.SpringBoot文件上传
SpringBoot整合Thymeleaf 1.创建Thymeleaf的入门项目 maven构建简单项目 修改pom文件添加thymeleaf的坐标 <!-- thymeleaf的坐标 --&g ...
- Spider_基础总结1_Request(get/post__url传参_headers_timeout)+Reponse
网络爬虫(一) 一.简介 1.robot协议(爬虫协议):这个协议告诉引擎哪些页面可以抓取,哪些不可以 -User-agent:爬虫引擎 -allow:允许robot访问的URL -disallow: ...
- 第05组 Alpha冲刺 (3/6)
.th1 { font-family: 黑体; font-size: 25px; color: rgba(0, 0, 255, 1) } #ka { margin-top: 50px } .aaa11 ...