方法的引用

/**
* @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方法的引用与构造方法引用的更多相关文章

  1. Java8 方法引用和构造方法引用

    如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・∀・(・∀・*),但是语言都是在进步的,就好比面向对象的语言 ...

  2. Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法

    本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...

  3. Lambda 方法引用

    1.方法引用:若Lambda 体中的内容有方法已经实现了,我们可以使用“引用方法”(可以理解为方法引用是Lambda表达式的另外一种表现形式) 方法引用主要有三种语法格式: ①  对象 :: 实例方法 ...

  4. 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用

    package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...

  5. JAVA 8 主要新特性 ----------------(五)Lambda方法引用与构造器引用

    一.Lambda方法引用 当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!(实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!) 方法引用: 使用操作符 “::” 将 ...

  6. java8 lambda方法引用

    注意引用方法的参数列表与返回值类型要与函数式接口中的抽象方法的参数列表与返回值类型保持一致 主要有三种语法格式: * * 对象::实例方法名 * * 类::静态方法名 * * 类::实例方法名 pub ...

  7. Java自学-Lambda 方法引用

    Lambda 方法引用 步骤 1 : 引用静态方法 首先为TestLambda添加一个静态方法: public static boolean testHero(Hero h) { return h.h ...

  8. JDK8新特性04 方法引用与构造器引用

    import java.io.PrintStream; import java.util.Comparator; import java.util.function.*; /** * 一.方法引用 * ...

  9. java8新特性——方法引用与构造器引用

    上篇文章简单学习了java8内置得4大核心函数式接口,这类接口可以解决我们遇到得大多数得业务场景得问题.今天来简单学习一下方法引用与构造器引用. 一.方法引用 方法引用:若lambda 体中得内容已经 ...

随机推荐

  1. Java集合工具类

    import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map ...

  2. 查看Oracle表中的指定记录在数据文件中的位置

    查看Oracle表中的指定记录位置select rowid,user_id from sshr.xx_user where user_id=3010586 select rowid,       db ...

  3. 学习Road map Part 03 编程和算法

    方法: 优先重复已学过的内容 写学习笔记

  4. 【Z】扩展阿里巴巴Java开发规约插件

    https://blog.csdn.net/u014513883/article/details/79186893 1.前言 工作中难免会遇到维护别人代码的情况,那么首先就得看懂别人写的代码.如果对方 ...

  5. win10 x64 注册ZQDeviceOcx.ocx控件

    正常的方式在32位系统下可行, 但是在64位系统下是不可行的. 在64位系统中正确的注册步骤是: 1. 将对应的ocx和dll放到C:\Windows\SysWOW64目录下. 2. 然后找到C:\W ...

  6. libevent使用event_new和不使用的两种方法

    写两个简单的demo,对照一下各自的方法 #include <sys/types.h> #include <event2/event-config.h> #include &l ...

  7. 简要总结 数据仓库VS数据库

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wl101yjx/article/details/31015367 本文简要总结以下两个问题,旨在高速 ...

  8. hdu1579 Function Run Fun(深搜+记忆化)

    版权声明:本文为博主原创文章.未经博主同意不得转载.vasttian https://blog.csdn.net/u012860063/article/details/37076755 转载请注明出处 ...

  9. 类图(Rose) - Windows XP经典软件系列

    版权声明:本文为xiaobin原创文章.未经博主同意不得转载. https://blog.csdn.net/xiaobin_HLJ80/article/details/24584625         ...

  10. CentOS7 安装配置备忘录

    1. 安装 epel 源 $ sudo yum install epel-release.noarch 如果想强制服务器使用 tuna 的镜像,可以如下修改 /etc/yum.repos.d/epel ...