1091 字
5 分钟
JDK8新特性
JDK8新特性
JDK5特性:
- 枚举 (Enum)
枚举是一种类型,在定义枚举时就指定枚举中的元素,在使用枚举时这些元素不能删除、添加。
public enum Week { //枚举元素一定要写在枚举的第一行 Mon("星期一"),Tue("星期二"),Web("星期三"), Thu("星期二"),Fir("星期二"),Stu("星期二"), Sun("星期日"); private String ename; private Week(String ename){ this.ename = ename; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } }- 可变参数
public class Test { //第二个参数是可变参数 //可变参数指定定义在最后一个参数位置,只能有一个可变参数 //调用方法时可以传入任意多个 int实参 //在方法中的可变参数实质是一个数组 public static void method(String str,int ... is){ System.out.println(str); for(int i:is){ System.out.println(i); } } public static void main(String[] args) { method("abc",1,2,2,3,3,4,4,4,3,6,7,8); } }JDK8特性
- 接口中可以定义默认方法和静态方法
- 函数式接口
只有一个抽象方法的接口,就是函数式接口
@FunctionalInterface注解 : 起到了一个校验作用,校验修饰的接口是否符合函数式接口的语法。有点类似于@Override注解
@FunctionalInterface public interface ITest { default public void method1(){ } public void method(); }- Lambada表达式
基本语法:
() -> {}
Lambada表达式是用来描述一段过程的,其实就是一个方法,定义一个方法,不需要定义方法名
new Thread(()->{ System.out.println("执行run");}).start();()代表方法过程的参数,参数的类型可以简化,可以推断的类型可以简化
{}中只有一行代码,且是return代码 ,{}和return都可以省略
Arrays.sort(strs,(o1,o2)->o1.length()-o2.length());Lambabda表达式的写法非常的简介,但是编译后的代码依然是接口对象
-
方法引用 : 可以引用一个方法,通过一种写法表示一个方法/构造器
,可以将一个方法作为实参传入到另一个方法中
方法引用的写法:
类名:: 静态方法
类名:: 非静态方法
对象:: 非静态方法
方法引用作为实参的语法:
要求调用方法参数需要的接口(函数式接口)中的抽象方法接口 和 方法引用的方法结构一致 ,方法名不必相同
思想层面:某个方法需要一个过程,可以使用Lambada表达式来描述这个过程;如果有一个现有的过程可以 使用方法引用的写法传入这个过程
代码层面:函数式接口的方法结构(除了方法名)和 方法引用的方法结构相同
执行层面:编译后出入的还是函数式接口的对象
List<String> list = new ArrayList<>(); Collections.addAll(list,"ab","cd","ef"); list.forEach((s)->{ System.out.println(s); }); list.forEach(System.out::println); //对集合中的字符串首字母转大写并输出 System.out.println("-------------"); list.forEach(Test::upperPrintln);public class Test { public static void method(){ System.out.println("执行了test的method方法"); } public static void upperPrintln(String str){ System.out.println(String.valueOf(str.charAt(0)).toUpperCase()+str.substring(1)); }}- Stream
增强了集合的聚合操作的功能,相当于一个高级的迭代器,通过迭代完成聚合操作,Stream封装了迭代的过程,提供了串行和并行两种操作模式。
- forEach方法:迭代方法
List<Integer> list = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //串行迭代 list.stream().forEach(System.out::println); //并行迭代 list.parallelStream().forEach(System.out::println);- map方法:对集合中的元素 通过一个映射操作 得到一个结果,后续可以对结果再次进行聚合操作(例如forEach()、size()、toList())。
public static void main(String[] args) { List<Integer> list = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //输出集合中的数据*2的结果 list.stream().map((s)->s*2).forEach(System.out::println); }- filter方法:对集合中的元素 通过一个过滤操作 得到一个结果
- limit方法:对集合中的元素 进行数量的限定
//输出集合中前3个数中大于2的数字 list.stream().limit(3).filter((s)->s>2).forEach(System.out::println); System.out.println("--------"); //输出集合中大于2的数字中的前3个数字 list.stream().filter((s)->s>2).limit(3).forEach(System.out::println);- sort方法:对集合的元素 进行排序的到一个结果
//输出集合从小到大顺序中第一个大于2的数字 System.out.println("----------"); list.stream().sorted().filter((s)->s>2).limit(1).forEach(System.out::println);- Collectors方法: 将结果存储到一个新的集合中
public static void main(String[] args) { List<Integer> list = Arrays.asList(3, 2, 2, 3, 7, 3, 5); //所有的奇数存到一个新集合中 List<Integer> list2 = list.stream().filter((s)->(s&1)==1) .collect(Collectors.toList()); System.out.println(list2); //用-连成字符串 List<String> list3 = Arrays.asList("a","b","c"); String str = list3.stream().collect(Collectors.joining("-")); System.out.println(str); }- distinct方法:对结果去重
- count方法:结果的个数
Java SE
Related articles
部分信息可能已经过时