jdk1.8工作实用特性总结

#jdk1.8工作实用特性总结

jdk8提供了很多新特性,lamda表达式,stream流式编程,函数式接口,日期类的更新,还有一些jvm相关的更改,开发最常用的就是lamda表达式还有流式编程,函数式接口。
下面针对这几个常用特性做一个稍微具体点的总结。有不足或者建议的地方还请多多指教。

#一、stream流式编程

1.获取集合中对象某个字段所有值

//获取person集合类中的所有name值得集合
List nameList=personsList.stream.map(Person::get).collect(Collections.toList());
2.将集合映射成一个Map
将集合映射成为一个(字段,字段)的map在这里插入图片描述

将集合映射成一个属性值,对象的map

在这里插入图片描述

3.将集合根据某个字段分组
按照性别,将集合按照里面的sex进行分组,里面有0,1分别代表男女

List personsList=new ArratList<>();
person.set…
person.set…
person.set…
person.setSex();.//本次
persons.add(person);
//这里省略一些假数组的代码
//下马对集合进行分组处理
Map<Integer,List> personMap=personsList.stream.collect(Collections.GroupBy(Person::getSex));

4集合的遍历

传统遍历集合的方式
1.for循环
2.增强for循环
对于这两种方式不做过多解释
我平时开发都是用下面这种方式
personsList.foreach(e->{
//e代表每个对象
//这里进行一些数据的处理
e.getUserName();

})

5.多个集合的合并 flatMap的使用
@Test
public void testFlatMap(){

    //java8的Optional flatmap   stream  map filter   distinck
    List<String> teamIndia = Arrays.asList("Virat", "Dhoni", "Jadeja");
    List<String> teamAustralia = Arrays.asList("Warner", "Watson", "Smith");
    List<String> teamEngland = Arrays.asList("Alex", "Bell", "Broad");
    List<String> teamNewZeland = Arrays.asList("Kane", "Nathan", "Vettori");
    List<String> teamSouthAfrica = Arrays.asList("AB", "Amla", "Faf");
    List<String> teamWestIndies = Arrays.asList("Sammy", "Gayle", "Narine");
    List<String> teamSriLanka = Arrays.asList("Mahela", "Sanga", "Dilshan");
    List<String> teamPakistan = Arrays.asList("Misbah", "Afridi", "Shehzad");

    List<List<String>> playersInWorldCup2016 = new ArrayList<>();
    playersInWorldCup2016.add(teamIndia);
    playersInWorldCup2016.add(teamAustralia);
    playersInWorldCup2016.add(teamEngland);
    playersInWorldCup2016.add(teamNewZeland);
    playersInWorldCup2016.add(teamSouthAfrica);
    playersInWorldCup2016.add(teamWestIndies);
    playersInWorldCup2016.add(teamSriLanka);
    playersInWorldCup2016.add(teamPakistan);


    // Let's print all players before Java 8
    List<String> listOfAllPlayers = new ArrayList<>();

    //将所有结合合成一个   传统做法
    for(List<String> team : playersInWorldCup2016){
        for(String name : team){
            listOfAllPlayers.add(name);
        }
    }

    //Java8之后操作
    List<String> allPlayerList = playersInWorldCup2016.stream().flatMap(pList -> pList.stream()).collect(Collectors.toList());
    System.out.println("所有的选手名字");
    allPlayerList.forEach(e->{
        System.out.println(e);

    });

}

6 Optional 防止空指针最好用的利器,个人最喜欢,最常用的一个工具类。

空指针测试

#二、lamda表达式受检异常的处理
   lambda是不支持受检异常抛出的,对于这种情况,我们只能将其包装一层再进行处理

在这里插入图片描述
本次使用的lamdaUtil中的包装方法在这里插入图片描述

#说明  在遍历的时候是一个典型的消费型的函数型接口,使用这样的方式将异常进行理解,如果你是在不懂,可以把它理解为工具。

三、函数式接口
java 8提供了大量的函数式接口,这些接口合理的应用会大大提高我们的工作效率,我们项目中很多工具类还有一些通用东西都是通过java8的函数式接口去实现。
这方面的东西网上太多了,就不细致描述了,感兴趣的可以去研究一下。
我们的遍历foreach就是通过Consume函数式接口实现的。
#三、实际开发业务逻辑数据组装思想

在我们的实际开发中大部分都是单表查询,这就使得我们业务数据的组装变得异常的麻烦,在我日常开发中我经常使用的组装思想就是
将两个表关联其中一张表,映射成一个map集合,将他们关联的字段作为key,很多数据都可以通过map的方法利用空间换时间的方式提升编码效率,而不是通过比较两个关联字段是否相等。举个使用的例子吧。
假设有两个表,一个单位表,这个表中存着单位的基本信息,比如单名名称,单位人数,一个单位性质表,这个表存着单位对应的一些性质,比如建设单位,咨询单位,监理单位。
现在业务需求需要两个表的数据组合。组合步骤如下:
//所有单位
List units= unitDao.queryAllUnit();
//所有单位性质
List unitAttrs=unitDao.queryAllUnitAttr();
//将单位性质表映射成一个map
Map<String,UnitAttr> unitAttrMap=unitAttrs.stream.collect.(Collectors.toMap(UnitAttr::getUnitId,e->e));

假设前端需要这样一个对象数据
UnitInfo
     这个类中包含单位名,单位人数,单位性质。
     数据处理如下:
List<UnitInfo>  unitInfos=new   ArrayList<UnitInfo>;
        units.foreach(e->{
        //数据的组装,防止空指针  这里使用了lombok插件,不熟悉的可以查一下
        UnitInfo  unitinfo= UnitInfo.unitName(Optional.OfNullable(e).orElseGet(Unit::new).getName)
        .unitCount(e.getCount).unitAttrName(Optional.OfNullable(unitAttrMap.get(e.getId))
        .orElseGet(UnitAttr::new).getAttrName))..Build();
		unitInfos.add(unitinfo);
});

这样数据就组装完毕,实现很简单,在我们具体的业务逻辑处理时如果从map中取出的是一个对象一定要谨慎空指针的发生。当然这些东西的确很简单,大佬看到请略过。
这只是一部分后续会继续更新。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值