方法的引用

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

方法的引用分类

静态方法引用

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

静态方法引用示例代码:

/**
* @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. c# 知识学习

    1.C#基础知识梳理系列 2.详解C#委托,事件与回调函数 3.C#制作Windows service

  2. Qt::FocusPolicy的使用

    http://blog.csdn.net/imxiangzi/article/details/50742813

  3. windows 安装redis并注册服务

        windows下载地址 https://github.com/MSOpenTech/redis/releases     启动:redis-server redis.windows.conf ...

  4. ListView实现下拉刷新(三)实现下拉刷新

    该准备的东西都已经准备好了.在这篇文章里,我们就开始实现下拉刷新功能吧. 一.大体的逻辑分析 我们来简单分析一下需要做的逻辑吧.首先分析头布局有几种状态.不下拉时,为正常状态,此时头布局隐藏.下拉到一 ...

  5. 编程三基:cpu:算法,总线(io):一切皆文件;内存:运行空间

    编程三基:cpu:算法,总线:一切皆文件:内存:数据.运行空间 原文找不到了.

  6. focal loss和ohem

    公式推导:https://github.com/zimenglan-sysu-512/paper-note/blob/master/focal_loss.pdf 使用的代码:https://githu ...

  7. 二. Python WebDriver环境搭建

    1. 安装Selenium 在命令行中输入: 显示安装成功: 2. 测试例子 打开百度页面并在输入框输入搜索内容(默认为firework) # 1. Selenium默认为Firefox.验证 fro ...

  8. String.format字符串拼接

    一.String.Format1.简介      String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. 2.参数      format()方法有两种重载形式. form ...

  9. [转]order by 1是什么意思?

    ORDER BY 1 表示 所select 的字段按第一个字段排序 ORDER BY ASC应该没有这样写法,ORDER BY 后面不是字段就是数字, 可以ORDER BY 1 ASC 或者ORDER ...

  10. 小修改,让mvc的验证锦上添点花

    首先,mvc的客户端验证用的是jquery.validate.js, jquery.validate本身已经提供了很好的扩展功能,通过简单点配置就可以做得更好看些. 而Microsoft通过jquer ...