阿凡相信大家肯定,所有的开发者都对Java8的一切感兴趣。虽然现在的JDK已经更新到JDK17了,但是阿芬相信很多公司还在使用JDK8甚至JDK8。JDK7,但是,有些公司即使升级到了JDK8,也没有完全使用JDK8中的一些东西。今天阿粉就把JDK8中比较好用的几个给大家放出来。JDK8大家都知道JDK8开始使用Lambda表达式,但是很多不管是教程还是其他书籍,在实际开发中都没有说要使用这个Lambda表达式,而是在JDK8中加入了一些新的。类都没有介绍过,所以阿粉想在这里给大家安利一波使用知识。Optional类对于大家来说是一个非常重要的类。不知道大家有没有被java.lang.NullPointerException疯狂的折磨过。很大,因为我们要在代码中疯狂的判断它是否为null,不为null怎么办,为null怎么办。不管怎样,想要解决java.lang.NullPointerException的问题,难免要加一些判断条件,而Optional类就是帮你优雅的处理null问题。先看Java7中的一些空实现:Useruser=usersMapper.selectUserById(userId);StringuserName=user.getUserName();if(user!=null){if(userName!=null&&!userName.isEmpty()){。....}}阿芬相信大家肯定都写过这样的代码,因为我们不知道SQL查询的数据中是否包含我们的Users对象。如果是Users对象,就会无情的出现java.lang.NullPointerException,这是一个空指针异常。这时候,就很尴尬了。老开发者一头雾水,我还有没有验证的地方?但是验证之后会发现代码量非常大,有点不好看,我们对比一下JDK8中提供给我们的方法进行验证。Useruser=usersMapper.selectUserById(userId);Optional.ofNullable(user).map(User::getUserName).ifPresent(userName->{....}大家看到这种链式编程,ofNullable()方法为我们提供了with来判断user是否为空,并验证userName,如果存在,则执行下面的逻辑可以看到代码是没有发现已经处理妥当了。而且很优雅。相信大家一定看过一些教程,里面会写:=Optional.ofNullable(user);Optionalstr=userOptional.map(User::getUserName);....但是比起代码的可读性,我们肯定要用JDK7以上的判断来做判断,但是这种JDK8链式编程在一定程度上减少了代码量,提高了开发效率会得到相应的改善。如果你不相信我,让我们运行我们的代码看看效果。Optional.ofNullable(user).map(User::getUserName).ifPresent(userName->{System.out.println("User用户名不为空");});各位,是不是好像我们想要一个判断null的操作瞬间变得高大上,代码的风格瞬间上升了一个档次。对于Optional类,Java8实战中已经给出了很多方法。阿芬也给大家扒了下来,做了一个总结。ofNullable方法:将指定值包裹在Optional中并返回。如果值为null,则返回它。一个空的Optional对象empty方法:返回一个空的Optional实例过滤方法:如果值存在并且满足提供的谓词,返回一个包含该值的Optional对象;否则返回一个空的Optional对象flatMap方法:如果该值存在,则对该值执行提供的映射函数调用,返回一个Optional类型的值,否则返回一个空的Optional对象get方法:如果该值存在,将该值包装在可选并返回它,否则抛出NoSuchElementException异常ifPresent方法:如果该值存在,则使用该值执行方法调用,否则什么也不做isPresent方法:如果该值存在,则返回true,否则返回falsemap方法:如果该值存在,对该值执行提供的映射函数并调用of方法:将指定值用Optional封装后返回,如果值为null则抛出NullPointerExceptionorElse方法:有值则返回,否则返回默认值orElseGetmethod:有值则返回,否则返回指定Supplier接口生成的值orElseThrowmethod:有值则返回,否则抛出由指定的Supplier接口生成的异常。看看这些方法有没有很多相似之处,比如map,flatMap,还有orElse,orElseGet,orElseThrow方法map和flatMap比较:这两个都是对值进行转换的操作,不同的是入参的类型不一样,map的入参是Functionmapper,flatMap的入参是Function>mapper。输入参数的不同也会导致返回值不同。map中获取的返回值自动被Optional包裹,flatMap中的返回值不变,但必须是Optional类型。这样看总觉得不对劲,还是去源码看看长啥样吧。地图:公共可选地图(功能<?superT,?extendsU>映射器){Objects.requireNonNull(映射器);如果(!isPresent())returnempty();否则{returnOptional.ofNullable(mapper.apply(值));}}flatMap:publicOptionalflatMap(Function>mapper){Objects.requireNonNull(mapper);if(!isPresent())returnempty();else{returnObjects.requireNonNull(mapper.apply(value));}}map方法参数中的函数mapper输出值,然后map方法使用Optional.ofNullable将其包装为Optional;而flatMap需要参数中的functionmapper输出是可选的。一个比较聪明,一个相对没那么聪明。人们会自己打包,对吧?同样比较的还有orElse,orElseGet,orElseThrow,不过这个范我就不说了,因为上面的方法解释很明显,可以看。Lambda表达式Lambda表达式其实就相当于一个匿名内部类,它允许我们的开发人员将一个函数作为参数传递给一个方法,然后把代码当作数据。阿芬相信大家一定明白这一点,例如下面的代码对比:Java7:ListstringList=Arrays.asList("1","2","3");for(Stringst:stringList){System.out.println(st);}Java8:Arrays.asList("1","2","3").forEach((Stringst)->{System.out.println(st);});同样我们肯定要用第二种写法,不是吗?其实Java8发布之后已经被很多公司使用了,但是还是有很多人因为不想改变自己的学习方式而选择了Java7。相信大家如果是一个立志要在开发领域继续走下去的人,那么一定会保持一颗不断学习的心,那么,你是这样的人吗?