java 1.8新特性 最核心lambda和stream Api
lambda表达式
-
箭头操作符 “->”
- 左侧:lambda参数列表
- 右侧:lambda表达式中所需要的功能. 即lambda体
-
语法格式一:
- 无参数:
public static void main(String[] args) { //注意事项,如果里面引用了局部变量 jdk1.7以前需要finally修改,现在不用,但是不能修改引用的值. Runnable runnable = new Runnable() { @Override public void run() { System.out.println("hello world1"); } }; runnable.run(); System.out.println("------------------------"); Runnable run = () -> System.out.println("hello world2"); run.run(); }
-
语法格式二:
- 有一个参数并且,无返回值
public static void main(String[] args) { Consumer<String> consumer = (x)-> System.out.println(x); consumer.accept("hello world"); //如果只有一个参数,参数的括号可以不写 Consumer<String> consumers = x-> System.out.println(x); }
- 有一个参数并且,无返回值
-
语法格式三:
- 有两个或多个参数,lambda体中有多条语句.并且有返回值
public static void main(String[] args) { //如果lambda体有多条语句 必须使用大括号,如果只是一条语句大括号可以省略不写 Comparable<Integer> comparable = (x, y) ->{ System.out.println("函数式接口"); return Integer.compare(x,y); }; }
- 有两个或多个参数,lambda体中有多条语句.并且有返回值
-
语法格式四:
public static void main(String[] args) { //如果lambda体有多条语句 必须使用大括号 Comparable<Integer> comparable = (x, y) -> { System.out.println("函数式接口"); return Integer.compare(x, y); }; //如果只是一条语句大括号可以省略不写,return也可以省略不写 Comparable<Integer> comparables = (a, b) -> Integer.compare(a, b); }
-
注意:
- lambda表达式的参数列表的数据类型,可以省略不写,因为jvm编译器可以通过上线文去推断出数据类型,即"类型推断".
- 例:List list = new ArrayList<>();
-
小结:
- 左参数或执行语句只有一个,括号是可以省略的,
- 左边省小括号,右边省大括号和return
- 左侧的数据类型可以省略,因为jvm能推断出数据类型
- 左参数或执行语句只有一个,括号是可以省略的,
-
lambda表达式需要"函数接口"的支持.
- 函数接口:接口中只有一个抽象方法的接口,称为函数式接口,可以使用注解@FunctionalInterface,可以检查是否存在函数接口.
- 示例:
- ` public static void main(String[] args) {
Integer opetion = opetion(10, (x) -> x + x);
System.out.println(opetion);
- ` public static void main(String[] args) {
}
public static Integer opetion(Integer id, Test1 test1){
return test1.add(id);
}
接口:
@FunctionalInterface
public interface Test1 {
public Integer add(Integer integer);
}
`