方法的引用

方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法引用

方法的引用分类

静态方法引用

如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用(静态方法的引用与实例方法的引用基本不受限制,只要满足调用条件即可)

静态方法引用示例代码:

/**
* @auther hhh
* @date 2018/12/28 23:02
* @description 如果函数式接口的实现恰好可以通过调用一个静态方法来实现,那么就可以使用静态方法引用
* 语法:类名::staticMethod
* 注意:
* 方法的引用不需要括号,因为其仅仅是方法的引用,并没有执行
* 使用的函数式接口输入输出必须与定义的函数式接口一致
*/
public class StaticMethodUse{
static <T> String hello(T s) {
return s.toString();
}
static <T> String ret() {
return "hello";
}
static void getSize(String s) {
System.out.println(s.length());
}
static String toUpCase(String s){
return s.toUpperCase();
}
public static void main(String[] args) {
Supplier<String> supplier = () -> hello("hello");
//使用方法引用 Supplier T get();
// 1、只支持输出参数,不支持输入参数,所以一下方法报错
//2、方法的引用为什么不需要括号?因为其仅仅是方法的引用,并没有执行
//Supplier<String> stringSupplier = StaticMethodUse::hello("wqer");
Supplier<String> s = StaticMethodUse::ret;
Supplier<String> supplier1 = Fun::put;
Function<Integer, String> function = StaticMethodUse::hello;
//方法的参数必须在调用的时候传入,必须调用函数式接口
System.out.println("function" + function.apply(123)); //普通lambda使用
Consumer<String> consumer = size -> StaticMethodUse.getSize(size);
//方法的引用为什么不需要括号?因为其仅仅是方法的引用,并没有执行
Consumer<String> c1 = StaticMethodUse::getSize;
c1.accept("hello use lambda"); //输出参数大写
Function<String ,String> function1 = (ss) -> ss.toUpperCase();
Function<String,String> function2 = StaticMethodUse::toUpCase;
Function<String,String> function3 = Fun::toUpCase;
System.out.println(function1.apply("aasdf"));
System.out.println(function2.apply("aasdf"));
System.out.println(function3.apply("aasdf"));
}
} class Fun {
static String put() {
return "hello";
}
static String toUpCase(String s){
return s.toUpperCase();
}
}

实例方法引用

如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用

示例代码:

/**
* @auther hhh
* @date 2018/12/28 23:29
* @description 实例方法引用
* 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现,那么就可以使用实例方法引用
* 语法: new instMethod()::method
* 注意:后面不需要加括号也不需要加参数
*/
public class InstantMethodUse extends Base {
String put() {
return "hello";
} public String toUpCase(String s) {
return s.toUpperCase();
} //调用当前实例的方法
void test() {
UnaryOperator<String> unaryOperator = this::toUpCase;
System.out.println(unaryOperator.apply("this inst method"));
//调用父类的实例方法
UnaryOperator<String> u1 = super::toUpCase;
System.out.println(u1.apply("use super upCase method"));
} public static void main(String[] args) {
Supplier<String> stringSupplier = () -> new InstantMethodUse().put();
Supplier<String> stringSupplier1 = () -> {
return new InstantMethodUse().put();
};
Supplier<String> stringSupplier2 = new InstantMethodUse()::put;
//普通lambda表达式使用
Supplier<String> stringSupplier3 = () -> new InstantMethodUse().put();
System.out.println(stringSupplier2.get());
//两种方式使用
UnaryOperator<String> unaryOperator = new InstantMethodUse()::toUpCase;
//新建对象引用
InstantMethodUse instantMethodUse = new InstantMethodUse();
UnaryOperator<String> unaryOperator1 = instantMethodUse::toUpCase;
System.out.println(unaryOperator.apply("lambda instMethod Use") + " === " + unaryOperator1.apply("lambda instMethod Use")); instantMethodUse.test();
}
}

Java8 Lambda表达式实战之方法引用(一)的更多相关文章

  1. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  2. 【Java学习笔记之三十一】详解Java8 lambda表达式

    Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Java 8之前 ...

  3. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

  4. Java8 lambda表达式10个示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里.在Ja ...

  5. Java8 lambda表达式10个示例<转>

    例1.用lambda表达式实现Runnable 我开始使用Java 8时,首先做的就是使用lambda表达式替换匿名类,而实现Runnable接口是匿名类的最好示例.看一下Java 8之前的runna ...

  6. java8 lambda表达式应用

    1.用lambda表达式实现Runnable非常简单// Java 8之前: new Thread(new Runnable() { @Override public void run() { Sys ...

  7. Java8 Lambda表达式、函数式接口和方法引用

    目录 Java8 Lambda表达式和函数式接口 Lambda表达式 Lambda的使用 函数式接口FunctionalInterface Java内置四大核心函数式接口 方法引用 构造器引用 Jav ...

  8. Java8 Lambda表达式详解手册及实例

    先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下 ...

  9. java8 Lambda表达式的10个例子(转)

    原文:http://jobar.iteye.com/blog/2023477 Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 收藏代码// ...

随机推荐

  1. Clean WRH$_ACTIVE_SESSION_HISTORY in SYSAUX

    Tablespace SYSAUX grows quickly. Run Oracle script awrinfo.sql to find what is using the space. One ...

  2. mongodb---js脚本操作速记

    之前写一些mongodb的同步或操作程序,往往使用perl,甚至c实现,这样程序很繁琐,而且逻辑不好控制,甚至一些功能和命令什么的,在这些语言的mongo驱动中就没有实现.后来发现mongodb 的s ...

  3. SAP专家培训之Netweaver ABAP内存管理和内存调优最佳实践

    培训者:SAP成都研究院开发人员Jerry Wang 1. Understanding Memory Objects in ABAP Note1: DATA itab WITH HEADER LINE ...

  4. 用npm-run自动化任务(转)

    自动构建JavaScript有不少好工具.不过其实很少有人知道,npm run命令就能很好地完成这一任务,配置起来也很简单. script npm会在项目的package.json文件中寻找scrip ...

  5. 蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  6. Motrix 全平台多功能下载工具[Windows、macOS、Linux]

    Motrix的界面很朴素,使用起来其实也很方便.点击左侧的「+」图标就可以添加下载任务,跟其他的下载工具没什么区别.暂停.恢复.查看.复制,这些功能都不缺.界面也挺好看的,下载速度还会提示在图标的角标 ...

  7. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  8. EOJ Monthly 2019.1 唐纳德先生与这真的是签到题吗 【数学+暴力+multiset】

    传送门:https://acm.ecnu.edu.cn/contest/126/ C. 唐纳德先生与这真的是签到题吗 单测试点时限: 6.0 秒 内存限制: 1024 MB 唐纳德先生在出月赛的过程中 ...

  9. Kali-linux准备内核头文件

    内核头文件是Linux内核的源代码.有时候,用户需要编译内核头文件代码,为以后使用内核头文件做准备,本节将介绍编译内核头文件的详细步骤. 准备内核头文件的具体操作步骤如下所示. (1)更新软件包列表. ...

  10. SqlMapConfig.xml配置文件

    SqlMapConfig.xml中配置的内容和顺序如下: 1.1 properties(属性) mybatis的属性加载顺序.读取顺序:properties------>resource或url ...