欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java8中新特性Optional、接口中默认方法和静态方法详解

程序员文章站 2023-12-17 17:08:22
前言 毫无疑问,java 8是java自java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和jvm等方面的十多个新特性。 java...

前言

毫无疑问,java 8是java自java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和jvm等方面的十多个新特性。

java 8是java的一个重大版本,有人认为,虽然这些新特性领java开发人员十分期待,但同时也需要花不少精力去学习。下面本文就给大家详细介绍了java8中新特性optional、接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧。

optional

optional 类(java.util.optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 optional 可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:

  • optional.of(t t) : 创建一个 optional 实例。
  • optional.empty() : 创建一个空的 optional 实例。
  • optional.ofnullable(t t) 若 t 不为 null,创建 optional 实例,否则创建空实例。
  • ispresent() : 判断是否包含值。
  • orelse(t t) : 如果调用对象包含值,返回该值,否则返回t。
  • orelseget(supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。
  • map(function f)  如果有值对其处理,并返回处理后的optional,否则返回 optional.empty() 
  • flatmap(function mapper) 与 map 类似,要求返回值必须是optional。

下面引用importnew的一段内容来告诉我们如何正确使用optional。比如千万不要写成这样子:

public static string getname(user u) {
 optional<user> user = optional.ofnullable(u);
 if (!user.ispresent())
 return "unknown";
 return user.get().name;
}

这样改写非但不简洁,而且其操作还是和第一段代码一样。无非就是用ispresent方法来替代u==null。这样的改写并不是optional正确的用法,我们再来改写一次。

public static string getname(user u) {
 return optional.ofnullable(u)
     .map(user->user.name)
     .orelse("unknown");
}

这样才是正确使用optional的姿势。那么按照这种思路,我们可以安心的进行链式调用,而不是一层层判断了。看一段代码:

public static string getchampionname(competition comp) throws illegalargumentexception {
 if (comp != null) {
  compresult result = comp.getresult();
  if (result != null) {
   user champion = result.getchampion();
   if (champion != null) {
    return champion.getname();
   }
  }
 }
 throw new illegalargumentexception("the value of param comp isn't available.");
}

由于种种原因(比如:比赛还没有产生冠军、方法的非正常调用、某个方法的实现里埋藏的大礼包等等),我们并不能开心的一路comp.getresult().getchampion().getname()到底。而其他语言比如kotlin,就提供了在语法层面的操作符加持:comp?.getresult()?.getchampion()?.getname() 所以讲道理在java里我们怎么办!

让我们看看经过optional加持过后,这些代码会变成什么样子。

public static string getchampionname(competition comp) throws illegalargumentexception {
 return optional.ofnullable(comp)
   .map(c->c.getresult())
   .map(r->r.getchampion())
   .map(u->u.getname())
   .orelsethrow(()->new illegalargumentexception("the value of param comp isn't available."));
}

这就很舒服了。optional的魅力还不止于此,optional还有一些神奇的用法,比如optional可以用来检验参数的合法性。

public void setname(string name) throws illegalargumentexception {
 this.name = optional.ofnullable(name).filter(user::isnamevalid)
      .orelsethrow(()->new illegalargumentexception("invalid username."));
}

上面代码引用importnew—java8 如何正确使用 optional。

接口中的默认方法与静态方法

java8接口中可以添加静态方法,也可以添加默认方法,默认方法用 default修饰。

public interface fun<t> {
 default void getname(){
  system.out.println("hello world");
 }
 static void getage(){
  system.out.println("nine");
 }
}

若一个接口中定义了一个默认方法,他的实现类的一个父类定义了具有相同名称和参数列表的方法。则调用该实现类的时候执行父类中的方法。

public class testf {
 public void getname(){
  system.out.println("testf");
 }
}
public interface testinterface {
 default void getname(){
  system.out.println("hello world");
 }
}
public class test extends testf implements testinterface{
 public static void main(string[] args) {
  test t = new test();
  t.getname();//输出的是testf
 }
}

若一个实现类实现了两个接口,如果一个父接口提供一个默认方法,而另一个父接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突,否则会报错。

public interface testinterface {
 default void getname(){
  system.err.println("hello world");
 }
}
public interface testinterface1 {
  void getname();
}
public class test1 implements testinterface, testinterface1{
 public void getname(){
  system.out.println("tes1f");
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

上一篇:

下一篇: