一、相比Java7,Java8的新特性
接口的默认方法 Java 8 允许给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法。 Lambda表达式 函数式接口 方法与构造函数引用 Java类库的新特性 Java 8 通过增加大量新类,扩展已有类的功能的方式来改善对并发编程、函数式编程、日期/时间相关操作以及其他更多方面的支持。二、Lambda表达式
lambda是十分常见的编程语言结构,在函数式编程语言(例如Lisp、Haskell)中使用范围极广。1.lambda表达式的定义
lambda表达式其实就是没有名称的函数,在Java中可以把它当成一个值。Java不允许脱离类的概念运行方法,所以lambda表达式是在某个类中定义的匿名方法(开发者可能不知道具体是哪个类)。2.lambda表达式语法
通常以(argument) -> {body}这样的格式书写,argument是参数,body是表达式主体,其中参数类型可以指定,也可以省略,省略的话,编译器可以自己推断出来类型。
(arg1,arg2...) -> {body} //省略参数类型
(Type1 arg1,Type2 arg2...)->{body} //指定参数类型 参数可以是零个或多个,多个时在括号中,用逗号分隔() -> {body} //零个参数时,用一个空的圆括号表示参数
(arg1) -> {body} 或者 arg1→{body} //一个参数 (arg1,arg2) -> {body} //多个参数 body表达式主体可以是零条或多条语句,包含在花括号中,body表达式主体只有一条语句时,花括号可以省略三、函数式接口(FunctionalInterface)
函数式接口是Java 8为支持Lambda表达式新发明的。lambda表达式依托于函数接口。它的定义:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。
@FunctionalInterface
public interface Lambda4Function { public int add(int x ,int y); }四、Lambda4Function接口的使用
public class Lambda4FunctionInterfaceTest { public static void main(String[] args){ //new一个匿名类对象 Lambda4Function lf1 = new Lambda4Function(){ public int add(int x,int y ){ return x+y; } }; int sum1 = lf1.add(3,4); System.out.println("旧方式求3+4="+sum1); //lambda表达式方式,指定参数类型 Lambda4Function lf2 = (int x,int y)->{return x+y;}; int sum2 = lf2.add(5,6); System.out.println("lambda方式,指定参数类型,求5+6="+sum2); //lambda表达式方式,不指定参数类型 Lambda4Function lf3 = (x, y)->{return x+y;}; int sum3 = lf3.add(7,8); System.out.println("lambda方式,不指定参数类型,求7+8="+sum3); } } 五、Runnable和Comparator接口的使用 1.Runnale接口,,新建线程public class Lambda4Runnable {
public static void main(String[] args){ Runnable oldRunnable = new Runnable() { public void run() { System.out.println(Thread.currentThread().getName() + ": Old Runnable"); } }; Runnable newRunnable = () -> { System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable"); }; new Thread(oldRunnable).start(); new Thread(newRunnable).start(); } } 2.Comparator接口,String数组排序public class LambdaStudy {
public static void main(String[] args){ String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" "); //旧方式实现 Arrays.sort(oldWay, new Comparator<String>() { public int compare(String s1, String s2) { return s1.toLowerCase().compareTo(s2.toLowerCase()); } }); System.out.println(String.join(",",oldWay));//lambda表达式实现
String[] newWay = "Improving code with Lambda expressions in Java 8".split(" "); Arrays.sort(newWay,(s1, s2) -> { return s1.toLowerCase().compareTo(s2.toLowerCase()); }); System.out.println(String.join(",",newWay)); } } 六、lambda表达式与集合类 public class Lambda4List { public static void main(String[] args){ List<String> ls = new ArrayList<String>(); ls.add("到餐"); ls.add("外卖"); ls.add("猫眼"); //旧的方式遍历 for(String st: ls){ System.out.println(st); } System.out.println("---------分隔符---------"); //lambda方式 ls.forEach(s -> {System.out.println(s);}); } }