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 体中得内容已经 ...
随机推荐
- LINUX系统文件类型分类
使用LINUX过程中,时常会对文件进行操作.但是linux中文件究竟有哪些分类呢?今天让我们大家来总结一下吧! 概述: linux文件可以分为五种类型,分别为:普通文件.目录.字符设备或块设备.套接口 ...
- js中直接调用函数和new函数的区别
如果函数返回值为常规意义上的值类型(Number.String.Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object.Array.Function),则 ...
- DFS BFS代码
#define maxnum 30 #include<bits_stdc++.h> int visited[maxnum]={0}; using namespace std; typede ...
- centos7下搭建sphinx全文检索引擎
Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...
- selenium+python 数据驱动-txt篇
#循环读取txt文件中的数据,可以作为用户名,密码等使用from selenium import webdriver #创建两个列表user=[]pwd=[]f=open(r'C:\bbs\data\ ...
- Ios国际化翻译工具
IOS Translation Tool(IOS国际化翻译工具) 介绍 当IOS项目国际化的时候,手工去翻译每一个字符串是一件非常痛苦的事情.尤其是当项目中存在N多种语言.而且又很难保证,手工翻译的准 ...
- [原]零基础学习视频解码之FFMpeg中比较重要的函数以及数据结构
在正式开始解码练习前先了解下关于FFmpeg中比较重要的函数以及数据结构. 1. 数据结构: (1) AVFormatContext AVFormatContext是一个贯穿始终的数据结构,很多函 ...
- Python Django 分页
Python Django 分页 http://www.360doc.com/content/14/0721/17/16044571_396090985.shtml
- Join Resig's “Simple JavaScript Inheritance ”
======================Enein翻译========================= John Resig 写了一篇关于 JavaScript 里类似其它语 ...
- 小技巧:快速清除项目中的svn相关文件!
习惯使用svn作为源代码管理工具,安全可靠 但是这些.svn字样的文件夹及文件也会随着源代码一同被deploy到Tomcat中,除了看着碍眼,也会占用Tomcat的性能 每次都是在项目部署目录里,搜索 ...