java 8 新特性

  今天在别人代码中发现java8 新特性,发现本身阅读代码有点儿吃力,非常汗颜,java8新特性都出来这么久了,只知其名不见其形,全部今天回家补了补知识。java

 

1、 接口sql

java8 中,接口中引入了新的关键字defaultstatic,经过使用default修饰方法,可让咱们在接口中定义具体的方法实现,也可以使用static关键字来定义接口方法。express

public interface InterClass {
    String test1(String str);
    default String test2(String str){
        return "test2:" + str;
    }
    static String test3(String str){
        return "test3:" + str;
    }
}

2、Lamdba表达式编程

Lambda表达式的语法格式以下:数组

(params) -> expression    或     (params) -> {statements;}

Lambda(兰布达)表达式,是推进Java 8 发布的最重要的新特性,这意味着Java也开始认可了函数式编程。函数式编程的一个特色就是容许把函数自己做为参数传入另外一个函数,还容许返回一个函数。使用Lambda表达式可使代码变的更加简洁紧凑。app

下面代码解释了什么是函数式接口编程:函数式编程

/**
 * 函数式接口
 * 函数式接口是值仅仅只包含一个抽象方法的接口(能够有多个default和static方法),
 * 每个Lambda表达式都会匹配到这个方法。
 * jdk1.8 提供了 注解@FunctionalInterface来定义函数式接口
 */
@FunctionalInterface
public interface FunInterface {
    String test1(String str);
    /**若是包含多个抽象接口,编译器会报错
     * 如在定义一个抽象方法 String test2(String str);
     * 可是能够定义任意多个的 default方法和 static方法
     */
    default String test3(String str){
        return "test3:" + str;
    }
    default String test4(String str){
        return "test4:" + str;
    }
    static String test5(String str){
        return "test5:" + str;
    }
    static String test6(String str){
        return "test6:" + str;
    }
}

测试:函数

public static void main(String args[]) {
    FunInterface funInterface = str -> "这是一个Lambda表达式";
    System.out.println(funInterface.test1(""));
    System.out.println(funInterface.test3("调用default方法"));
    System.out.println(FunInterface.test5("调用static方法"));
}

Lambda表达式的重要特征:测试

  1. 可选类型声明:不须要声明参数类型,编译器能够统一识别参数值。
  2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数须要定义圆括号。
  3. 可选的大括号:若是主体包含了一个语句,就不须要使用大括号。
  4. 可选的返回关键字:若是主体只有一个表达式返回值,则编译器会自动返回值,大括号须要指定表达式返回了一个数值。

Lambda表达式的变量做用域:this

  1. Lambda表达式只能引用标记为 final的外层局部变量。
  2. Lambda表达式的局部变量能够用声明为final,可是必须在后面的代码中不能进行修改。
  3. Lambda表达式中不容许声明一个与局部变量同名的参数或局部变量。

 

3、方法引用

Jdk1.8 提供了另外一种调用方式一对冒号( :: ),当你须要使用方法引用时,目标引用放在分隔符 :: 前,方法的名称放在后面,及 ClassName::methodName,注意:调用构造函数引用为ClassName::new

public class TestMethodAddr {
    @FunctionalInterface
    public interface FunInterface {
        TestMethodAddr getTestMethodAddr(String a,String b);
    }
    private String a;
    private String b;
    public TestMethodAddr(String a,String b){
        this.a = a;
        this.b = b;
    }
    public String addStr(){
        return a + b;
    }
    public String append(String c){
        return a + "," + b + "," + c;
    }

    public static void main(String[] args){
        FunInterface funInterface = TestMethodAddr::new;
        TestMethodAddr test = funInterface.getTestMethodAddr("A", "B");
        System.out.println(test.addStr());
        System.out.println(test.append("C"));
    }
}

4、Stream

Java 8 中添加了一个新的抽象称为流Stream,可让你以一种声明的方式处理数据。能够将Stream看做一种流,流在管道中传输,而且能够在管道的节点上进行处理,如排序、筛选、聚合运算等。

Stream是一个来自数据源的元素队列并支持聚合操做。Stream提供了内部迭代的方法,经过访问者模式(Visitor)实现(iteratorforeach为外部迭代)

  1. 数据源:stream流的产生对象,能够是集合、数组、IO channel等。
  2. 元素:指特定类型的对象,造成一个对象。
  3. 聚合操做:相似sql语句同样的操做,好比filtermaplimitfindsorted等。

  4.1 生成流stream:使用方法stream() 为集合建立串行流,parallelStream() 为集合建立并行流。

  4.2 forEach:stream提供了新的方法 forEach来迭代流中的每一个数据。如:

  List list = Arrays.asList(1,2,3,4,5);
  list.stream().forEach(System.out::println);

  4.3 map:stream提供了map方法来用于映射每一个元素到对应的结果。如:

    List<Integer> list = Arrays.asList(1,2,3,4,5);
    list.stream().map(i -> i + i);
    list.stream().map(i -> i + i).forEach(System.out::println);

  4.4 filter: filter方法用于经过设置条件过滤出元素。如:

    List<Integer> list = Arrays.asList(1,2,3,4,5);
    // 过滤大于3的元素
    list.stream().filter(i -> i > 3).forEach(System.out::println);

  4.5 limit:limit方法用于获取指定数量的流。如:

    List<Integer> list = Arrays.asList(1,2,3,4,5);
     // 获取前 3个stream流
     list.stream().limit(3).forEach(System.out::println);

  4.6 Sorted:sorted方法用于对流进行排序。如:

     List<Integer> list = Arrays.asList(5,2,3,1,4);
     // 将list中的元素从小到大进行排序
     list.stream().sorted((a,b) -> (a > b ? 1 : -1)).forEach(System.out::println);

 

5、日期时间

新增各类日期时间处理类。

LocalDate为日期处理类、LocalTime为时间处理类、LocalDateTime为日期时间处理类。

DateTimeFormatter格式化日期时间处理类。

相关文章
相关标签/搜索