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运行环境 ...
随机推荐
- [Luogu] 矩形覆盖
https://www.luogu.org/problemnew/show/P1034 数据太水 爆搜过掉 #include <iostream> #include <cstdio& ...
- windows游戏编程了解消息事件模型
本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22309265 作者:jadeshu 邮箱: jades ...
- 8月清北学堂培训 Day4
今天上午是赵和旭老师的讲授~ 概率与期望 dp 概率 某个事件 A 发生的可能性的大小,称之为事件 A 的概率,记作 P ( A ) . 假设某事的所有可能结果有 n 种,每种结果都是等概率,事件 A ...
- C++ new 和 delete
l new操作符(new operator) string *ps = new string(“Memory Management”); 这里的new是由语言内建的,我们成为new关键字.new操作符 ...
- JavaWeb_(Spring框架)Spring与JDBC
一.用Spring中的JdbcTemplate操作数据库 在MySQL中准备一个user表,表中增加一条假数据 用Spring中的JdbcTemplate操作数据库,在JdbcTemplate中实现增 ...
- JavaWeb_(Mybatis框架)MyBatis Generator简单入门
官方文档 传送门 下载地址 传送门 MyBatis Generator(MBG)简介: MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为 ...
- asp.net core spa应用(angular) 部署同一网站下
需求:现在一个应用是前后端开发分离,前端使用angular,后端使用 asp.net core 提供api ,开发完成后,现在需要把两个程序部署在同一个网站下,应该怎么处理? 首先可以参考微软的官方文 ...
- 《梁宁·产品思维30讲》课程学习笔记(内含全套音频+ppt资料
科技进步.产品迭代.公司演化.组织变迁……不变的是用户的情绪和人性. 那些信奉“用户驱动”的人,从普通人变成了行业大佬,建立了自己的世界.乔布斯.马化腾.马云.雷军.张小龙.周鸿祎.傅盛……这些改变世 ...
- Xshell查看日志
查询日志命令(复制后鼠标右键粘贴): tail -1000f /mnt/logs/SMFManagement/SMFManagement_info.log
- Tornado实现监控数据实时展示
前言: It has been a while since I last updated my blogs. 使用Tornado开发一个实时监控信息系统,其中包括 CUP.内存.网卡.磁盘使用率. 涉 ...