jdk1.8 -- 自定义FunctionInterface
一.自定义函数的理解
对于java提供的一些函数,用lambda表达式是可以解决一些问题的,但是在对于一些比较复杂的数据类型在处理时,可能会有些力不从心了,但是
我们可以通过自定义的一些函数,通过使用lambda的方式来执行,这样就可以节省不必要的麻烦。
二.自定义函数的过程
1.定义原数据
2.自定义FunctionInterface
3.测试类
//原数据
public class Persion { private String name; private Integer age; private Integer phoneNum; public Persion(String name, Integer age, Integer phoneNum) {
this.name = name;
this.age = age;
this.phoneNum = phoneNum;
} @Override
public String toString() {
return "Persion [name=" + name + ", firstName=" + firstName + ", lastName=" + lastName + ", address=" + address
+ ", age=" + age + ", phoneNum=" + phoneNum + "]";
} }
//定义FunctionInterface
@FunctionalInterface
public interface ConsumerPersion<A,B,C,D> { D create(A a,B b,C c); }
//在接口上添加FunctionInterface
//以表示该函数只有唯一的一个方法,在通过编译调用时,不会产生歧义
//测试类
public class MainTest { public static void main(String[] args) { Persion persion = createPersion("张三",23,123,(a,b,c) -> new Persion(a,b,c));
System.out.println(persion);
} public static Persion createPersion(String name,int age,int number,ConsumerPersion<String, Integer, Integer, Persion> cp){ return cp.create(name, age, number);
}
}
//定义调用函数
在ConsumerPersion这个泛型接口中定义了4种数据类型,A,B,C,D, 而函数create的定义是传入A,B,C,返回D,因此我们可以知道,D就是返回的Persion,而A,B,C则是persion
中包含的属性的数据类型,再通过构造函数,可以确定A,B,C的数据类型,分别是String,Integer,Integer,因此确定了泛型接口中泛型参数的数据类型,以及返回值
//执行流程
当执行createPersion()这个方法时,需要传入参数name,age,number,同时还有一个带有泛型的接口,当我们把正常的参数name,age,number传入后,对于这个泛型接口的传参
我们可以随便写3个变量代替,可推导出要返回的Persion,通过构造函数将3个变量传入。
三.对lambda函数使用的理解
对于函数lambda的的使用,其实就是匿名函数的应用推导的过程,我们要实现ConsumerPersion中的方法,最简单、最直接的就是写一个匿名函数来实现
new ConsumerPersion<String,Integer,Integer,Persion>(){
@override
public Persion create(String name,Integer age,Integer phoneNum){
return new Persion(name,age,phoneNum);
}
}
但是从jdk1.8之后,它对于这样的代码直接进行了优化,不需要写这样的代码,而是通过特殊字符来标识这样的代码
createPersion("张三",23,123,(a,b,c)-> new Persion(a,b,c))
当虚拟机加载到这段代码时,会通过这些特殊的标识符,并通过加载标记为@FunctionInterface 的函数,动态的生成相应的代码,以实现相对应的需求,
这样做的目的,大大的简化了开发者的工作量
jdk1.8 -- 自定义FunctionInterface的更多相关文章
- 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)
一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...
- [原创]自定义参数静默方式安装JDK1.8
摘要:当Java桌面程序开发完成做产品的时候,面对未知的安装环境,通常是编写一些预安装检测脚本/程序,让程序傻瓜化安装以便减少分发出去的产品带来 的未知工作量(安装答疑,操作系统问题引起安装失败等), ...
- 在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service
在 CentOS7 上将自定义的 jar 包注册为 linux 服务 service 1.在 /etc/rc.d/init.d/ 目录下创建一个名字和服务名完全相同的 shell 脚本文件 joyup ...
- JDK1.5/1.6/1.7之新特性总结(转载)
原文地址:http://www.cnblogs.com/yezhenhan/archive/2011/08/16/2141510.html 如果原作者看到不想让我转载请私信我! 开发过程中接触到了从j ...
- JAVA自定义注解
在学习使用Spring和MyBatis框架的时候,使用了很多的注解来标注Bean或者数据访问层参数,那么JAVA的注解到底是个东西,作用是什么,又怎样自定义注解呢?这篇文章,即将作出简单易懂的解释. ...
- 【集合框架】JDK1.8源码分析之Comparable && Comparator(九)
一.前言 在Java集合框架里面,各种集合的操作很大程度上都离不开Comparable和Comparator,虽然它们与集合没有显示的关系,但是它们只有在集合里面的时候才能发挥最大的威力.下面是开始我 ...
- JDK各个版本的新特性jdk1.5-jdk8
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...
- java、Android SDK、adb环境变量配置,以及JDK1.7换JDK1.8
最近因项目需要使用将JDK1.7换成JDK1.8,故重新清晰地记录各种环境变量的配置: 这里更改的均是系统变量,不是用户变量 java环境变量配置: 变量名 变量值JAVA ...
- Mac10.9用brew搭建Eclipse4.4+Maven3.2.3+JDK1.8运行环境
--------------------------------------- 博文作者:迦壹 博客标题:Mac10.9用brew搭建Eclipse4.4+Maven3.2.3+JDK1.8运行环境 ...
随机推荐
- @ControllerAdvice与@ControllerAdvice统一处理异常
https://blog.csdn.net/zzzgd_666/article/details/81544098(copy) 详细看此 所以结合上面我们可以知道,使用@ExceptionHandler ...
- tinymce+粘贴word图片例子
tinymce是很优秀的一款富文本编辑器,可以去官网下载.https://www.tiny.cloud 这里分享的是它官网的一个收费插件powerpaste的旧版本源码,但也不影响功能使用. http ...
- W tensorflow/core/platform/cpu_feature_guard.cc:45]
W tensorflow/core/platform/cpu_feature_guard.cc:] The TensorFlow library wasn't compiled to use SSE3 ...
- Spark(二)CentOS7.5之Spark2.3.1HA安装
一 下载安装包 1 官方下载 官方下载地址:http://spark.apache.org/downloads.html 2 安装前提 Java8 安装成功 zookeeper 安装成功 had ...
- JDK8 新特性 Lambda表达式
1.java8中Lambda表达式基础语法: (x,y) -> {} 左侧是一个小括号,里面是要实现的抽象方法的参数,有几个参数就写几个参数名,无参可写空括号,无需声明参数类型: 中间是一个jd ...
- easyui复选框实现单选框
$(':checkbox[name=primary_key_flag]').each(function(){ $(this).click(function(){ if(this.checked){ $ ...
- jmeter-Charles抓包显示的请求方式错误了,难道
抓包显示的请求方式为get,但是get一直报错见上图 将get修改为post就正确了
- based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较
Design — Gunicorn 19.9.0 documentationhttp://docs.gunicorn.org/en/stable/design.html#async-workers e ...
- C#问答题与附解收集(三)
post.get的区别 答: GET把参数包含在URL中,POST通过request body传递参数.GET请求在URL中传送的参数是有长度限制的,而POST没有.使用post提交的页面在点击[刷新 ...
- docker下搭建owncloud
在ubuntu下 搭建owncloud 用docker-compose启动,owncloud.yml文件内容 owncloud: image: owncloud: restart: always 开机 ...