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 体中得内容已经 ...
随机推荐
- Thread.Join()的详解
什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序中的一个执行流,每个线程都有自己的专有寄 ...
- 在Java中如何进行BASE64编码和解码
在Java中如何进行BASE64编码和解码 //在Java中如何进行BASE64编码和解码 package me.xzh.study.sun.misc.BASE64; import sun.misc. ...
- Windows 10 KMS 手工激活
第一.安装好Win10系统,不需要安装其他激活工具.第二.是删除默认序列号,打开命令提示符(管理员),运行 slmgr.vbs -upk,可提示已卸载了序列号. slmgr /ipk W269N-WF ...
- Fcoin和Coinex,谁更值得投资?
2018年是数字货币市场很熊的一年,大部分币种在这一年下跌超过了90%.但是这一年对于数字货币的发展也是不平凡的,可以说是至关重要的一年.通证经济商业模型在这一年萌芽,并茁壮成长,2018是通证经济元 ...
- Struts2注解 及 约定优于配置
Struts2注解 1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包, ...
- Selenium应用代码(常见封装的方法二)
滚动窗口: //将滚动条滚到适合的位置 , 方法一 public static void setScroll(WebDriver driver,int height){ try { // String ...
- 剑指offer13 在O(1)时间删除链表的结点
把下一个节点的值直接赋值给要删除的节点,然后删除下一个节点.当这样做会有两个bad case:被删除的链表结点的下一个结点为空指针,如果链表只有一个结点.其实链表只有一个结点应该属于下一个结点为空指针 ...
- Linux关于scp命令
声明:本文主要转自https://www.2cto.com/os/201503/379474.html scp主要应用场景如下: (1)必要时,每个季度或者每月将数据由这台服务器传输到另外一台,不过前 ...
- AAAI 2016 paper阅读
本篇文章调研一些感兴趣的AAAI 2016 papers.科研要多读paper!!! Learning to Generate Posters of Scientific Papers,Yuting ...
- zabbix时间不同步
Linux下如何实现与Internet时间同步 一.安装ntp [root@server-2 ~]# yum install -y ntpdate 二.同步时间 // 方式一.使用域名连接,要经过DN ...