1.Java8新特性简介
java8是Oracle公司在2014年3月18日发布的
速度更快、代码更少(增加了新的语法Lambda表达式)、强大的Stream API、便于并行、最大化减少空指针异常
2.Java8包含的主要内容:
1)Lambda表达式
Lambda表达式允许将函数作为参数进行传递,免去了使用匿名函数
2)函数式接口
在一个接口中之定义一个特定功能的方法。
3)方法引用和构造器引用
可以直接引用类或对象的方法或构造器。与Lambda联合使用,减少代码的冗余度,使代码更见紧凑简介。
4)Stream API
加强了对集合的各种操作,极度的方便开发
5)接口中默认方法和静态方法
6)新时间日期API
加强对日期的处理
7)其他特性
3.Lambda表达式的使用
语法:
新的操作符: 【->】,它将表达式分为两部分。
左侧:指定Lambda表达式需要的参数;
右侧:指定Lambda体,即Lambda表达式需要执行的功能。
1)与平常使用的匿名函数的比较
案例比较一(无参):
package com.hxc.lambda; /** * sun_flower */ public class Java8Test { public static void main(String[] args) { Runnable runnable = new Runnable() { @Override public void run() { System.out.printf(" Hello World! --来自普通函数的呼喊"); } }; runnable.run(); Runnable rn = () -> System.out.println(" Hello World!!! --来自Java8新特性的呼唤"); //这里的()即为左侧 空参; -> 后的为右侧,整个要表达的逻辑功能 rn.run(); } }
案例比较二(有参):
package com.hxc.lambda; import java.util.Comparator; import java.util.TreeSet; /** * sun_flower */ public class Java8Test { public static void main(String[] args) { TreeSet<String> treeSet = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return Integer.compare(o1.length(), o2.length()); } }); TreeSet<String> newTreeSet = new TreeSet<>( (o1, o2) -> { //能够自动推断参数类型,当然也可以写上参数类型 return Integer.compare(o1.length(), o2.length()); }); } }
2) Lambda表达式只能引用外部带有final的外层局部变量,这意味着在Lambda体中不能修改该局部变量。
(如果在外部没有声明为final,且未曾改变该变量,则默认是final类型;如果修改过,则会报错)
案例:
//接口部分
package com.hxc.myInterface; @FunctionalInterface public interface MathOperation { int operation(int a, int b); }
package com.hxc.lambda; import com.hxc.myInterface.MathOperation; /** * sun_flower */ public class TestMathOperation { public static void main(String[] args) { int c = 1; //在Lambda表达式中使用了该变量,则默认为final类型 // c = c + 1; //放开注释,则会报错 MathOperation mo = (a, b) -> a + b + c; //使用局部变量c MathOperation mo2 = (a, b) -> a - b; MathOperation mo3 = (a, b) -> {return a * b;}; //使用大括号 MathOperation mo4 = (a, b) -> a / b; printMathOper(4, 2, mo); } public static void printMathOper(int a, int b, MathOperation mo) { System.out.println(mo.operation(a, b));; } }