语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利

顺带用到一些泛型编程,一切都是为了简化代码
场景:
一个数据类,用于记录职工信息
public class Employee {
public String name;
public int age;
public char sex;
public String time;
public int salary;
}
我们有一列此类数据
List<Employee> data = Arrays.asList(e1,e2,e3......)
现在有需求:将员工Employee按照姓名的首字母(假设均为英文名)进行分组:
那么我们要得到的结果应该是一个Map:char -> List<Employee> 这样的映射关系
public static Map<Character, List<Employee>> groupByFirstChar(
List<Employee> data){
Map<Character, List<Employee>> result = new HashMap<>();
for(Employee e : data){
Character c = e.name.charAt(0);
List<Employee> l = result.get(c);
if(l == null){
l = new ArrayList<>();
result.put(c, l);
}
l.add(e);
}
return result;
}
代码并不复杂,很快就可以完成,老板看你效率这么高,于是说,再按照工资分个组吧,5000以下的,5000~10000的 ...等
也不会太难,将key换一下,稍作逻辑处理即可
public static Map<String, List<Employee>> groupBySalary(List<Employee> data) {
Map<String, List<Employee>> result = new HashMap<>();
for (Employee e : data) {
String key = separate(e.salary);
List<Employee> l = result.get(key);
if (l == null) {
l = new ArrayList<>();
result.put(key, l);
}
l.add(e);
}
return result;<br>}
private static String separate(int salary) {
if (salary <= 5000) {
return "5000以下";
}
if (salary <= 10000) {
return "5000~10000";
}
if (salary <= 20000) {
return "10000~20000";
}
return "20000以上"
}
然后老板又说了,按照员工的入职年份分下组吧。。。
这里就代码就不写了,稍作比较可以发现,无论怎么分组,唯一的变化是key值的选取方式,
第一次将Employee的name的第一字母作为key:
Employee e -> e.name.charAt(0)
第二次将Employee的salary按照方法separat转换为String作为key:
Employee e -> separate(e.salary):String
以此类推
Employee e -> getYear(e.time):String
事实上第一次也可以将获取首字母单独写成一个方法
Employee e -> getFirstChar(e.name):Character
为了看起来更美观,可以讲三个方法的参数都设置成Employee 方法体就不写了 这里只列出参数和返回值
Employee e -> getFirstChar(e) : Character Employee e -> separate(e) : String Employee e -> getYear(e) : String
->的左边为参数,:的右边为返回值,->的右边是方法的签名
那么我们自然会想到将变化的部分抽取为参数,其他不变的部分抽取为方法体,那么就可以省去那些重复的代码,显然变化的部分就是上面列出的,将Employee e转化成key的方法,但是我们知道java是不能把方法作为参数进行传递的。不过对于稍有经验的程序猿来说这并不是问题,我们可以使用接口来实现我们的目的,同时又会遇到另一个问题,以上三个方法的返回值是不同的,因此我们要用到泛型:
public static <K> Map<K, List<Employee>> groupByKey(List<Employee> data, GetKey<K> getKey){
Map<K, List<Employee>> result = new HashMap<>();
for(Employee e : data) {
K key = getKey.getKey(e);
List<Employee> l = result.get(key);
if (l == null) {
l = new ArrayList<>();
result.put(key, l);
}
l.add(e);
}
return result;
}
interface GetKey<K>{
K getKey(Employee e);
}
那么上面的第一个需求就可以这样实现
Map<Character, List<Employee>> result = groupByKey(data, new GetKey<Character>() {
@Override
public Character getKey(Employee e) {
e.name.charAt(0);
}
});
第二个需求
Map<String, List<Employee>> result = groupByKey(list, new GetKey<String>() {
@Override
public String getKey(Employee e) {
separate(e.salary);
}
});
可以发现,我们只需要更改泛型参数和匿名内部类的实现即可,唯一的问题恐怕是这么写实在不太好看,而且很多例行公事的代码,尤其体现在匿名内部类上。
事实上我们只关心这个匿名内部类的参数和返回值,其他部分仅仅是语法要求。
java8恰好为我们提供了很好的方式来避免复杂的例行公事的方式:lambda表达式,以上实现就可以写成
Map<Character, List<Employee>> resultByFirstChar = groupByKey(list, e -> e.name.charAt(0)); Map<String, List<Employee>> resultBySalary = groupByKey(list, e -> separate(e.salary));
lambda表达式恰恰只表现出我们所关心的,参数和返回值,同时由于类型推断,可以省去参数类型,具体语法这里就不介绍了,网上可以查到很多资料
extra:
如果你对泛型有不错的了解的话,方法groupByKey还可以进一步抽象:
public static <K, E> Map<K, List<E>> groupBy(List<? extends E> data, Function<? super E, ? extends K> fun) {
Map<K, List<E>> result = new HashMap<>();
for(E e : data) {
K k = fun.apply(e);<br> List<E> l = result.get(k);
if(l == null) {
l = new ArrayList<>();
result.put(k, l);
}
l.add(e);
}
return result;<br>
}
我们将Employee这个类也抽取了,好处显而易见
Function接口是java8新加入的接口:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
输入一个T类型 返回R类型。泛型和函数式编程结合的很不错,虽然java8的新特性被各种吐槽,但是能带来好处总是好的,这给了我们更多的选择。
有时间的话会介绍stream,java8的另一大利器
以上所述是小编给大家介绍的Java8中lambda表达式的应用及一些泛型相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# java8
# lambda表达式
# java
# lambda
# 泛型
# Java Lambda表达式超详细介绍
# Java编程中使用lambda表达式的奇技淫巧
# Java Lambda表达式详解和实例
# java lambda表达式用法总结
# Java8新特性之Lambda表达式浅析
# Java Lambda表达式语法及用法示例
# 就不
# 返回值
# 就可以
# 写了
# 例行公事
# 小编
# 稍作
# 新特性
# 首字母
# 是一个
# 事实上
# 很好
# 还可以
# 第一个
# 在此
# 不太
# 均为
# 以此类推
# 看你
# 表现出
相关文章:
如何快速搭建安全的FTP站点?
如何在IIS7上新建站点并设置安全权限?
内部网站制作流程,如何建立公司内部网站?
香港网站服务器数量如何影响SEO优化效果?
成都网站制作报价公司,成都工业用气开户费用?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
在线制作视频的网站有哪些,电脑如何制作视频短片?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
个人摄影网站制作流程,摄影爱好者都去什么网站?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
青岛网站建设如何选择本地服务器?
ui设计制作网站有哪些,手机UI设计网址吗?
建设网站制作价格,怎样建立自己的公司网站?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
网站制作服务平台,有什么网站可以发布本地服务信息?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
大同网页,大同瑞慈医院官网?
移民网站制作流程,怎么看加拿大移民官网?
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
建站之星如何防范黑客攻击与数据泄露?
,石家庄四十八中学官网?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
微信推文制作网站有哪些,怎么做微信推文,急?
如何选择高效稳定的ISP建站解决方案?
七夕网站制作视频,七夕大促活动怎么报名?
如何解决ASP生成WAP建站中文乱码问题?
想学网站制作怎么学,建立一个网站要花费多少?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
网站制作需要会哪些技术,建立一个网站要花费多少?
,交易猫的商品怎么发布到网站上去?
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
网站制作模板下载什么软件,ppt模板免费下载网站?
如何用PHP工具快速搭建高效网站?
SQL查询语句优化的实用方法总结
如何用5美元大硬盘VPS安全高效搭建个人网站?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
5种Android数据存储方式汇总
如何通过西部数码建站助手快速创建专业网站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
江苏网站制作公司有哪些,江苏书法考级官方网站?
宁波免费建站如何选择可靠模板与平台?
常州自助建站工具推荐:低成本搭建与模板选择技巧
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
如何快速上传建站程序避免常见错误?
黑客如何利用漏洞与弱口令入侵网站服务器?
如何通过.red域名打造高辨识度品牌网站?
详解jQuery停止动画——stop()方法的使用
如何打造高效商业网站?建站目的决定转化率
*请认真填写需求信息,我们会在24小时内与您取得联系。