lambda方法的引用与构造方法引用
方法的引用
/**
* @auther hhh
* @date 2018/12/29 22:37
* @description
*/
public class ObjectMethodUse {
/**
* 对象方法的引用(有限制条件)
* 抽象方法的第一个参数类型刚好是实例方法的类型(函数式接口的抽象方法必须要有输入参数),抽象方法剩余
* 的参数恰好可以当做实例方法的参数。如果函数式接口的实现能由上面说的实例方法调用来实现的话,
* 那么就可以使用对象方法的引用(两个条件都要满足)
* 语法:
* 类名::instMethod
*/
public void notUseObjectMethod(){
//不能使用对象方法引用,因为其没有输入参数
//比如如下函数式接口
Runnable r = ()->{};
Closeable c = () ->{};
Supplier<String> s = ()->" ";
}
public static void main(String[] args) {
//抽象方法的类型恰好是实例方法的类型
//参数巧合是Too类型,调用的方法也是too的方法(Too too 与 new Too()是同种类型)
//剩余的参数恰好可以当做实例方法的参数(Consumer<T>函数式接口没有返回值,Too中的foo也没有返回值)
Consumer<Too> consumer = (Too too) -> new Too().foo();
//可以使用对象方法引用
Consumer<Too> consumer1 = Too::foo; consumer.accept(new Too());//invoke method
consumer1.accept(new Too());//invoke method
//不能转化为对象方法引用,不满足抽象方法的类型恰好是实例方法的类型
Consumer<Too> consumer2 = (Too too) -> new Too1().foo(); BiConsumer<Too1,String> biConsumer = (Too1 too,String s) -> new Too1().fun(s);
BiConsumer<Too1,String> biConsumer1 = Too1::fun;
biConsumer.accept(new Too1(),"输入参数,调用方法");
biConsumer1.accept(new Too1(),"输入参数,调用方法"); BiFunction<Prod,String,Integer> biFunction = (Prod s,String s1)->new Prod().fun(s1);
//实例方法引用
BiFunction<Prod,String,Integer> biFunction1 = Prod::fun;
System.out.println(biFunction.apply(new Prod(),"12345"));//
System.out.println(biFunction1.apply(new Prod(),"12345"));//5 //使用自定义函数式接口(有参数,且第一个参数类型为实例方法的类型)
Execute2<Prod,String,String> execute2 = ( Prod,name,size) -> new Prod().fun2(name,size);
Execute2<Prod,String,String> e= Prod::fun2;
}
}
class Prod{
Integer fun(String s){
return s.length();
}
void fun2(String s,String s1){ }
}
//不符合使用对象方法引用,第一个参数需要是自定义的参数类型 T,不能是JDK自带的对象类型
@FunctionalInterface
interface Execute1{
void run(String name,String size);
}
//修改成这样就可以了
@FunctionalInterface
interface Execute2<T,R,U>{
void run(T t,R name, U size);
}
class Too{
void foo(){
System.out.println("invoke method");
};
}
class Too1{
void foo(){
System.out.println("invoke method");
};
void fun(String s){
System.out.println(s);
}
}
构造方法的引用
/**
* @auther hhh
* @date 2018/12/30 11:19
* @description 构造方法引用
*/
public class ConstructMethodUse {
/**
* 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就
* 可以使用构造方法引用
* 语法:
* 类名::new
*/
public static void main(String[] args) {
//调用Person 无参构造函数
Supplier<Person> personSupplier = ()->new Person();
//由Supplier<Person> 可以推断出Person::new 中Person 的类型
Supplier<Person> personSupplier1 = Person::new;
personSupplier.get();//invoke person construct
personSupplier1.get();//invoke person construct //需要有无参构造函数
Supplier<List<String>> supplier = ArrayList::new;
Supplier<Thread> threadSupplier = Thread::new; //有参构造函数
Consumer<Integer> c1 = (i)->new Student(i);
Consumer<Integer> c2 = Student::new;
c1.accept(1);//有参构造
c2.accept(1);//有参构造
Function<String,Integer> function = s -> s.length();
Function<String,Integer> function1 = String::length;
//第一个参数String Student的参数类型,第一个参数是new Student实例的参数
Function<String,Student> function2 = Student::new;//有参构造String
}
}
class Person{
public Person() {
System.out.println("invoke person construct");
}
}
class Student{
public Student(int i) {
System.out.println("有参构造");
}
public Student(String s) {
System.out.println("有参构造String");
}
public Student() {
System.out.println("无参构造");
}
}
lambda方法的引用与构造方法引用的更多相关文章
- Java8 方法引用和构造方法引用
如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...
- Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法
本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...
- Lambda 方法引用
1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ① 对象 :: 实例方法 ...
- 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用
package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...
- JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用
一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...
- java8 lambda方法引用
注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...
- Java自学-Lambda 方法引用
Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: public static boolean testHero(Hero h) { return h.h ...
- JDK8新特性04 方法引用与构造器引用
import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * ...
- java8新特性——方法引用与构造器引用
上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...
随机推荐
- git error:【fatal: unable to access 'https://github.com/userId/prjName.git/': err or setting certificate verify locations:】
$ git pull origin master fatal: unable to access 'https://github.com/userId/prjName.git/': err or se ...
- WIN7与WIN10 安装
---恢复内容开始--- 开始的操作系统是黑白屏的DOS,随着光标的一闪一闪并逐渐后移,一条条指令输入电脑,并执行相关指令完成任务.慢慢的,视窗操作系统最初是基于DOS的windows 9X内核WIN ...
- My SQL 和SQL Server区别
MySQL 与SQL Server区别 今天了解了二者区别,整理网上查阅资料,总结列举如下: MSSQL == SQL server 是sybase与微软合作时期的产物. 对于程序开发人员而言,目前使 ...
- February 20 2017 Week 8 Monday
Behind every beautiful thing, there's some kind of pain. 美丽背后,必有努力. No pains, no gains, and sometime ...
- ojdbc14_g.jar与ojdbc14.jar区别
在低级JDK版本1.2与1.3中使用的驱动,class12.jar,虽然实际上在1.4,1.5中使用大部分情况也是OK的 ojdbc14.jar (1,545,954 bytes) - classes ...
- mongodb在windows平台安装和启动
mongodb 官网:https://www.mongodb.com mongodb 官网下载: mongodb-win32-x86_64-2008plus-ssl-3.4.2-signed.msi ...
- PHP----作业:查询数据显示在页面上
作业: 查询INFO表所有数据,显示在页面上(表格)性别要显示男女 民族 显示民族名称 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tra ...
- 7、springmvc的自动配置
1.springmvc的自动配置 文档:https://docs.spring.io/spring-boot/docs/2.1.1.RELEASE/reference/htmlsingle/#boot ...
- 2019.1.3 Mac安装免费版StarUml3.0.2 &&&Xmind思维导图 &&Google浏览器***版
下载StarUml http://staruml.io/ 好像需要FQ 附赠一个 链接:https://pan.baidu.com/s/1_pa9LwopowhOTum5g89zZQ 密码:fxtc ...
- Docker创建镜像文件并在容器中运行
1.如何创建镜像文件 首先找到Docker ToolBox安装的路径,在路径下直接新建Dockerfile文件 在Dockerfile文件里写入的内容为: FROM docker/whalesay:l ...