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 体中得内容已经 ...
随机推荐
- 无缓冲和带缓冲channel的区别
常规定义的channel都是默认不带缓冲的,如下代码所示 package main import ( "fmt" ) func main() { c := make(chan in ...
- UNIX和linux系统性能监控工具oswatcher
可以在一台机器上运行oswatcher.把运行的结果拷贝到有vnc的机器上进行分析.java -jar oswbba.jar -i /mnt/hgfs/database/oswbb/archive . ...
- sqoop部署与使用
sqoop安装 1.下载并解压 scp sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz mini1:/root/apps/ tar -zxvf sqoop-1.4 ...
- 为什么S/4HANA的销售订单创建会触发生产订单的创建
调用S/4HANA销售订单创建函数SD_SALES_DOCU_MAINTAIN创建一个销售订单时,会触发生产订单的创建. 销售订单的每个行项目对应一个独立的生产订单,SD_SALES_DOCU_MAI ...
- hibernate mysql 分页时报错 显示的代码和sql server 类似 select top 1……
[ERROR][com.alibaba.druid.filter.stat.StatFilter]merge sql error, dbType mysql, sql : select top 1 d ...
- 关于Hibernate的报错org.hibernate.MappingException: Unknown entity
部分异常,如下 org.hibernate.MappingException: Unknown entity: com.zcd.hibernate.oneToMany.Teamat org.hiber ...
- JavaScript 初学备忘录
JavaScript 是脚本语言 JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTML 页面的编程代码. JavaScript 插入 HTML 页面后,可由所有的现 ...
- 获取Windows安装日期
- sql server 获取存储过程,表值,标量函数的参数
所有的参数都是存在 sys.parameters 这个表中的,我们可以仿造 sql得到表中的列信息 这篇中的sql语句(提示:我们在表值函数中创建的表,最后我们是返回这个表的,我们可以用这个sql语句 ...
- ASP.NET教程
1.ASP.NET是一个使用Html Css JavaScript和服务器脚本创建网页和网站的开发框架 2.ASP.NET支持三种开发模式:WebPages(Web页面).MVC(Model View ...