方法引用

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基础教程——方法引用的更多相关文章

  1. Java基础教程(18)--继承

    一.继承的概念   继承是面向对象中一个非常重要的概念,使用继承可以从逻辑和层次上更好地组织代码,大大提高代码的复用性.在Java中,继承可以使得子类具有父类的属性和方法或者重新定义.追加属性和方法. ...

  2. Java基础教程(12)--深入理解类

    一.方法的返回值   当我们在程序中调用方法时,虚拟机将会跳转到对应的方法中去执行.当以下几种情况发生时,虚拟机将会回到调用方法的语句并继续向下执行: 执行完方法中所有的语句: 遇到return语句: ...

  3. Java基础教程:注解

    Java基础教程:注解 本篇文章参考的相关资料链接: 维基百科:https://zh.wikipedia.org/wiki/Java%E6%B3%A8%E8%A7%A3 注解基础与高级应用:http: ...

  4. Java基础教程:面向对象编程[2]

    Java基础教程:面向对象编程[2] 内容大纲 访问修饰符 四种访问修饰符 Java中,可以使用访问控制符来保护对类.变量.方法和构造方法的访问.Java 支持 4 种不同的访问权限. default ...

  5. Java基础教程:面向对象编程[1]

    Java基础教程:面向对象编程 内容大纲 Java语言概述 Java语言特点 1.Java为纯面向对象的语言,它能够直接反映现实生活中的对象.总之,Everything is object! 2.平台 ...

  6. Java基础教程:面向对象编程[3]

    Java基础教程:面向对象编程[3] 内容大纲 基础编程 获取用户输入 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入.我们可以查看Ja ...

  7. Java基础教程(25)--I/O

    一.I/O流   I/O流表示输入源或输出目标.流可以表示许多不同类型的源和目标,例如磁盘文件.设备.其他程序等.   流支持许多不同类型的数据,包括字节.原始数据类型.字符和对象等.有些流只传递数据 ...

  8. Java基础教程:Java内存区域

    Java基础教程:Java内存区域 运行时数据区域 Java虚拟机在执行Java程序的过程种会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟 ...

  9. Java基础教程:垃圾回收

    Java基础教程:垃圾回收 垃圾回收 垃圾回收(Garbage Collection,GC),顾名思义是释放垃圾占用的空间,防止内存泄漏.有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使 ...

随机推荐

  1. D. Number of Parallelograms 解析(幾何)

    Codeforce 660 D. Number of Parallelograms 解析(幾何) 今天我們來看看CF660D 題目連結 題目 給你一些點,求有多少個平行四邊形. 前言 @copyrig ...

  2. Mongodb命令 --- MongoDB基础用法(二)

    Mongodb命令 数据库操作 创建数据库 MongoDB 创建数据库的语法格式如下: use DATABASE_NAME 如果数据库不存在,则创建数据库,否则切换到指定数据库. 删除数据库 Mong ...

  3. elk部署(实战一)

    项目介绍: 系统:redhat7.6 软件:es+logstash+kibana  6.1 IP+主机名 192.168.0.10    elk1 192.168.0.10    elk2 192.1 ...

  4. 震惊!你还不知道SpringBoot真正的启动引导类

    引言 SpringBoot项目中的启动类,一般都是XXApplication,例如「StatsApplication」,「UnionApplication」. 每个项目的启动类名称都不一样.但是它的启 ...

  5. 联发科Mediatek工业路由芯片上网稳定低功耗的Router模块WiFi中继——无线AP定制方案

    Router模块又名路由器模块,是指将路由器的接口类型及部分扩展功能是可以根据实际需求来进行无线接入服务,允许其他无线设备接入,通过局域无线端或联网远程端,进行数据访问,对无线设备进行远程控制.常见的 ...

  6. SQL中WHERE子句中为什么不能使用聚合函数?

    我们先来看一下这个代码: SELECT * FROM product WHERE SUM(slae_price) > 1000 GROUP BY product_type; 这样子会报错: SE ...

  7. 80386学习(一) 80386CPU介绍

    一.80386CPU介绍 Inter80386CPU是Inter公司于1985年推出的第一款32位80x86系列的微处理器.80386的数据总线是32位的,其地址总线也是32位,因而最大可寻址4GB的 ...

  8. 完美实现CSS垂直居中的11种方法

    在做前端项目时CSS的水平居中我们经常使用,但有时还会用到CSS垂直居中,对于小白来说这个就有些难度了,下面看一下我是如何实现的 本人前端小白,正在做一个小程序开发的项目,css样式调整搞的头都大了. ...

  9. sqlserver with(NOLOCK) 或 with(READPAST)

    https://blog.csdn.net/shuicaohui5/article/details/6758868

  10. JavaScript全局变量与局部变量

    JavaScript中存储数据值的容器称为变量.根据变量作用域可将变量分为全局变量和局部变量. 全局变量(Global Variable) 拥有全局作用域,在JavaScript代码中任何地方都有定义 ...