Java8中新特性Optional、接口中默认方法和静态方法详解
前言 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本。这个版本包含语言、编译器、库、工具和JVM等方面的十多个新特性。 Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习。下面本文就给大家详细介绍了Java8中新特性Optional、接口中默认方法和静态方法的相关内容,话不多说了,来一起看看详细的介绍吧。 Optional 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."); } 由于种种原因(比如:比赛还没有产生冠军、方法的非正常调用、某个方法的实现里埋藏的大礼包等等),我们并不能开心的一路 让我们看看经过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"); } } 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |