简述1.8特性


前言

随着技术的不断发展,jdk8也坐上了业界的头把交椅,在此简单叙述下8较之以往的部分新特性


一、函数式接口

函数式接口必须有且只有一个抽象方法,可有0或多个default方法,default方法无需实现,可在实现类中直接调用,可有0或多个static方法,函数式接口中的default和static方法,都可通过Interface.method()的方式直接调用,其中注解@FunctionalInterface可用来限制函数式接口不能修改为普通的接口。
需要注意以下几点:

  • 当一个类实现的两个接口中有同名default方法时,该类需要重写这个default方法
  • 当一个类实现的接口中的default方法m1()和这个类继承的父类中某一方法m1()重名时,那么这个类的m1()方法是继承于父类的,而不是接口中的default方法

代码如下(示例)

//接口
@FunctionalInterface
public interface InterfaceTest  {
    void simpleMethod();
    default void defaultMethod(){
		system.out.println("可直接定义方法体");
    };
    static void staticMethod(){
		system.out.println("可直接定义方法体");
    };
}

//实现类
public class lambdaTest implements LambdaInterface {
        public static void main(String args[]){
        	//default方法无需实现,可通过实现类直接调用
        	new lambdaTest().defaultMethod();
        	//default和static方法可通过接口直接调用
        	LambdaInterface.defaultMethod();
        	LambdaInterface.staticMethod();
        }
        @Override
    	public void simpleMethod() {
        	system.out.println("实现的方法体");
    	}
}

二、Lambda表达式

我们可以把Lambda表达式可以看成匿名内部类的简写方式。前提是这个匿名内部类必须是一个函数式接口,其基本语法为:(参数列表) -> {代码块},在jdk1.8中Comparator和Runnable接口就是典型的函数式接口,下面以Comparator接口来演示
需要注意以下几点:

  • 方法参数类型可省略
  • 当方法参数只有一个时,圆括号可省略
  • 当方法体内的代码块只有一行时,花括号可省略
  • 当方法体内的代码块只有一行且有返回值时,return可省略

由于Lambda表达式的本质为匿名内部类,所以需要遵循匿名内部类的相关规则,当匿名内部类在访问外部局部变量时,变量必须为 final ,该规则在Lambda表达式中体现为:

  • 在使用Lambda表达式的时候,代码块中不允许修改外部具部变量

代码如下(示例):

	List<Integer> list = Arrays.asList(1,3,2);
   	Collections.sort(list, new Comparator<Integer>() {
         @Override
         public int compare(Integer o1, Integer o2) {
             return o1 - o2;
         }
    });
	//根据基本语法(参数列表) -> {代码块}写为
    list.sort( (Integer o1,Integer o2) -> { return  o1 - o2;} );
    //根据简化规则可简写为
	list.sort( (o1,o2) -> o1 - o2 );

三、Optional

在日常书写代码的过程,我们需要经常对变量进行判空处理,才有可能避免空指针问题。Optional的出现在一定程度上帮我们解决了这个问题。

在这段代码中,只要user或address为空就会导致空指针

	String postcode = user.getAddress().getPostcode(); 

如果想要避免这个问题,我们需要把代码写成这样

	String postcode = ""; 
	if(user != null){
		Address address = user.getAddress();
		if(address != null){
			postcode = address .getPostcode(); 
		}
	}

当我们引入Optional时可以把代码写成这样

    String postcode= Optional.ofNullable(user)
      .flatMap(u -> u.getAddress())
      .flatMap(a -> a.getCountry())
      .map(c -> c.getIsocode())
      .orElse("default postcode");

关于Optional现在个人只懂这么多,有内容之后再补充吧


新的特性还有stream api、新的Date类、hashMpa实现的改变,剩下的以后再说

总结

个人感觉Lambda表达式和Optional更像是语法糖,虽然会让代码看起来简洁很多,却牺牲了一部分可读性,当团队内技术水平良莠不齐的时候,这将会增大代码更新维护的成本

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值