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运行环境 ...
随机推荐
- 009_Linux驱动之_request_irq()函数
1. request_irq()函数原型 int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags ...
- Greenplum 的发展历史
一.Greenplum的发展历史 Greenplum的发展可以分为下面6个阶段: 图 1 Greenplum时间线 Postgres关系型数据库.Postgres是UC Berkeley开发的关系 ...
- nios ii 13 主程序的函数可以用Open Declaration 查看,但是编译的时候却说 undefined reference to 。。。这是为什么?
在做12864 ip 核试验时,写了三个文件第一个是时序文件QC12864.v第二个是QC12864.H这个文件主要包括声明和宏定义,第三个文件是QC12864.c这个文件包含函数的定义.详细的请看 ...
- C语言学习笔记3-运算符和表达式
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/50752023 作者:jadeshu 邮箱: jades ...
- 进入docker 容器命令行
#!/bin/bash CNAME=$1 CPID=$(docker inspect --format "{{.State.Pid}}" $CNAME) nsenter --tar ...
- Undertow
Spring Boot 内嵌容器Undertow参数设置 配置项: # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程 # 不要设置过大,如果过大,启动 ...
- 基于Kafka+ELK搭建海量日志平台
早在传统的单体应用时代,查看日志大都通过SSH客户端登服务器去看,使用较多的命令就是 less 或者 tail.如果服务部署了好几台,就要分别登录到这几台机器上看,等到了分布式和微服务架构流行时代,一 ...
- Linux 时间同步 Chrony
chrony 是网络时间协议(NTP)的通用实现. chrony 包含两个程序:chronyd 是一个可以在启动时启动的守护程序.chronyc 是一个命令行界面程序,用于监视 chronyd 的性能 ...
- 如果你的电脑想升级并且支持m.2接口
便宜啊,赶紧入手. 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- 客户端配置代理服务实现yum上外网
vi /etc/profile http_proxy=http://172.20.188.193:3128/https_proxy=https://172.20.188.193:3128/expor ...