今天在别人代码中发现java8 新特性,发现本身阅读代码有点儿吃力,非常汗颜,java8新特性都出来这么久了,只知其名不见其形,全部今天回家补了补知识。java
1、 接口sql
在java8 中,接口中引入了新的关键字default和static,经过使用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表达式的重要特征:测试
Lambda表达式的变量做用域:this
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)实现(iterator、foreach为外部迭代)。
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格式化日期时间处理类。