Java SE8 是2014年发布的。其重要特性包括 lambda表达式、stream、functional 接口以及时间类API。
本文针对以上特性,通过示例行解释说明。

1 lambda
2 functional
3 Streams
4 Date/Time API

1 Lambda表达式

    从编程角度看,lambda表达式就是匿名函数。JavaScript的ajax callback很好的体现lambda的使用。
    只不过不像JavaScript需要声明function。 其典型的使用如下:
    (x, y)->x+y    
    使用的类、或方法是什么都不重要,重要的是接收2个参数,返回和值。
    
    lambda的语法如下:
    (parameters) -> expression
    (parameters) -> { statements; }
    () -> expression
    
    一些示例:
    (int a, int b)->a*b   //接收2个整型,返回乘积
    (a, b)->a-b //接收2个数值型,返回差值
    ()->99  //无接收参数,返回常量
    (String a)->System.out.println(a) //接收字符串并打印输出
    a-> 2*a  //接收1个数值型,返回2倍该值
    c->{ /*复杂处理*/  }  //接收一个变量,进行逻辑处理
    
    通过语法和示例可见lambda有以下一些特点:
    1 可以接收0、1、或多个参数
    2 参数的类型可以指定,也可以不指定。不指定时通过上下文决定。
    3 单个参数可以不加括号。无参数、或多个参数需要加括号
    4 body可以包含单个、或多个表达式。当只有一个的时候可以不加括号。
    5 当body是一个表达式,结果是返回值不加return
    
2 Functional Interface
 
  功能接口,内部有且仅有一个抽象方法,这里所说的不包括Object对象中的toString()和equals(Object obj)方法。如下示例:
   @FunctionalInterface
   public interface MyFirstFunctionalInterface{
       void firstWrok();
   } 
  注意,声明@FunctionalInterface不是一定要有的,仅用于编译约束。 另外,接口内也可以有默认实现,方法通过default进行修饰
  示例:
    public interface Moveable {
      default void move(){
          System.out.println("I am moving");
      }
    }
    public class Animal implements Moveable{
       public static void main(String[] args){
            Animal tiger = new Animal();
            tiger.move();
        }
    }

   jdk中java.util.function提供了多种功能接口,如Function、Consumer、Supplier等等。 

 3 Stream

   另一个较大的改进是java 8提供了streams api, 可以对集合数据进行过滤,转换等各种流式操作。 java8之前如果要删除list中某些特别的的对象,需要额外定义临时存储,进行查找后再删除。 stream方式支持直接过滤掉得到符合条件的数据。
   示例1:
     List<String> items= Arrays.asList("abdc","acbb","abae","aebc");
     String prefix = "ab";
     List<String> filteredList = items.stream().filter(e -> (!e.startsWith(prefix))).collect(Collectors.toList());
   结果:[acbb, aebc] 

   示例2:
     List<String> alphabets = Arrays.asList("a","b","b","d");
     alphabets.forEach(l-> System.out.print(l.toUpperCase()));
   结果: ABBD

   stream结合lambda表达式可以很到程度简化代码量,并且具有较强的可读性。

  4 Date/Time API
    1)Date 类本版本基本废弃使用,由LocalDate,LocalTime 和 LocalDateTime替代, 表示本地时间日期。 
       LocalDate:仅表示日期,不包含时间和时区
       LocalTime: 仅表示时间,不包括日期和时区
       LocalDateTime: 表示日期时间,不包括时区
    如果需要包含时区,可以使用 OffsetTime, OffsetDateTime. 时区偏移可以通过ZoneId获得。

    2)表示绝对时间的类是:Instant
    Instant提供了多种计算时间的静态方法

      Instant instant = Instant.now();
        Instant instant1 = instant.plus(Duration.ofMillis(5000));
        Instant instant2 = instant.minus(Duration.ofMillis(5000));
        Instant instant3 = instant.minusSeconds(10);

    3)计算时间差值提供了 Duration 和 Period。 

    Duration用来计算很短的时间差,要求有较高的精度:    
       Duration duration = Duration.ofMillis(5000);
         duration = Duration.ofSeconds(60);
         duration = Duration.ofMinutes(10);
    
    Period用来计算日期差:
        Period period = Period.ofDays(6);
        period = Period.ofMonths(6);
        period = Period.between(LocalDate.now(), LocalDate.now().plusDays(60));

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐