专业的编程技术博客社区

网站首页 > 博客文章 正文

你真的开始用JDK8了吗?(jdk8用什么tomcat)

baijin 2024-08-20 10:22:02 博客文章 6 ℃ 0 评论

java的大部分开源框架也早已支持jdk8,但是你真正开始使用jdk8了吗?jdk8给你的代码带来哪些改变?今天我们来梳理下,JDK8的特性给我们的代码带来哪些改变?

Optional

NullPointerExceptions是在调用其他接口的时候,必须要考虑的问题。在业务代码中充斥着很多if(user!=null)..这样的判断空的代码。在Jdk8中提供了Optional来帮助我们优雅的解决NullPointerExceptions问题。

使用示例

我们来看下面一个示例:

一个用户包含手机号和固定电话,输入一个用户对象,获取这个用户的联系方式,如果手机号不为空,则为手机号,否则如果固定电话不为空,则返回固定电话,否则默认返回“000000”

我们先来看下在jdk8以前的实现:

User user = getUser();

if (user == null) {

return "000000";

if (user.getMobilePhone() != null

&& !user.getMobilePhone().isEmpty()) {

return user.getMobilePhone();

}

if (user.getPhone() != null

&& !user.getPhone().isEmpty()) {

return user.getPhone();

}

return "000000";

我们接着看下使用Optional以后的用法:

Optional<User> user = Optional.ofNullable(getUser());

Optional<String> mobilePhone =

user.flatMap((u) -> Optional.ofNullable(u.getMobilePhone()))

.filter(s->!s.isEmpty());

Optional<String> phone =

user.flatMap((u) -> Optional.ofNullable(u.getPhone()))

.filter(s->!s.isEmpty());

return mobilePhone.orElse(phone.orElse("000000"));

相信大多数开发者觉得第一种方式更容易看懂,而且对于这个需求来说,大部分开发者的实现也是第一种方式。因为第一种方式是大家从刚学编程语言开发,最熟悉的方式。从第一种方式转向使用Optional来实现本需求时,是一种思维的转变。从以往的null的方式转向Optional这种新的方式。那么这两种方式的思维有哪些改变呢?

第一种方式,是一种命令式的思维方式,这是我们从学编程的第一天起就熟悉的过程式的思维,程序执行了什么样的步骤,得到了什么样的结果。我们可以通过设计优秀的算法来优化执行的步骤,提高程序的性能。

第二种方式,是一种函数式的思维方式,在函数式的思维方式里,结果比过程更重要,不需要关注执行的细节。程序的具体执行由编译器来决定。这种情况下提高程序的性能是一个不容易的事情。

我们再回到Optional,来说说使用它容易陷入的误区

使用isPresent&get来“优雅”的避免空值判断

我们知道了Optional为我们提供了可以优雅的避免空指针的方案,我们以上的代码还可以这样写

Optional<User> user = Optional.ofNullable(getUser());

if (user.isPresent()) {

return "000000";

}

if (Optional.ofNullable(user.get().getMobilePhone()).isPresent()

&& !user.get().getMobilePhone().isEmpty()) {

return user.get().getMobilePhone();

}

以上代码我们避免了像user==null这样的代码,我们使用了Optional的isPresent方法进行优雅的判空,但是这不是最好的方案,也不是使用Optional的初衷,所以当你的代码里出现了Optional的isPresent或者get方法你就要注意了,看下是否是正确的使用了Optional,另外在你使用get时,必须要使用isPresent做判断

使用Optional类型做参数或者属性

在设计类或者方法时,也没有必要使用Optional作为参数和属性,可以使用它作为返回值,这是推荐的。参数和属性的本质是做数据的传递,Optional是作为一种避免使用null的容器类。

Lambda Expressions

Lambda表达式也是jdk8中新增的一大特性,也是JDK8中最火的一个特性,在上节中,我们已经使用了Lambda表达式。并且Lambda表达式也是函数式编程思维的一种体现,上面也已经提到过,函数式编程思维。

示例如下,有一个名字集合,我们来对名字进行排序、查找能操作

List<String> names = Arrays.asList("Name1", "Name2", "S4",

"Name3", "Name4", "S1", "S2");

排序:使用()->{}替代匿名类

//jdk8 before

Collections.sort(names, new Comparator<String>() {

@Override

public int compare(String o1, String o2) {

if (o1.startsWith("N") && !o2.startsWith("N")) {

return -1;

}

return 1;

}

});

//Lambda

Collections.sort(names, (o1, o2) -> o1.startsWith("N")

&& !o2.startsWith("N") ? -1 : 1);

查找:循环

//jdk8 before

List<String> startWithN = new ArrayList<>();

for (String name : names) {

if (name.startsWith("N")) {

startWithN.add(name);

}

}

//Lambda

List<String> startWithN2 = names.stream()

.filter((name) -> name.startsWith("N"))

.collect(Collectors.toList());

在以上的示例中我们使用了stream,其中stream也是jdk8的一大特性这个将在下篇讲。

函数式编程

在java8中为了支持函数式的编程,java8引入了java.util.function的包,其中Predicate接口是支持Lambda的函数式的编程。

private static List<String> filter(List<User> users,

Function<User, String> function) {

List<String> pros = new ArrayList<>();

users.forEach((user) -> {

pros.add(function.apply(user));

});

return pros;

}

List<User> users = new ArrayList<>();

users.add(new User("1232","2323"));

List<String> phones=filter(users,(user)->user.getPhone());

phones.forEach(System.out::println);

在以上的示例中,就实现了一个获取一个user的集合中,所有的电话号码的需求,当然以上的filter方法在stream中已经存在,直接使用即可,在上面我们只作为一个示例。

————————————————

版权声明:本文为CSDN博主「wangyan9110」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/WANGYAN9110/article/details/69670761

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表