1.Lambda表达式的使用
-
特殊的匿名内部类,语法更为简洁
-
允许把函数作为一个方法的参数,将代码像数据一样传递
-
引入了新的操作符" ->" ,这个操作符将表达式范围两部分
-
左侧(参数1,参数2)表示参数列表
-
右侧{ }内部是方法体
-
形参类型会自动推断
-
Comparator<String> comparator1= (o1, o2)->{ return 0; };
-
o1、o2会自动推断出是等号前面泛型的String类型 所以写与不写不影响o1、o2类型
-
-
如果形参列表为空只要保留()
-
如果形参只有一个()可以省略只写参数名称就可以
-
如果执行语句只有一句,且没有返回值{}可以省略,若有返回值,若想省去{}则必须同时省略return,且执行语句也保证只有一句;
-
Lambda语句不会生成匿名内部类文件
-
2.函数式接口
-
如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lanbda表达式,Lambda表达式会被匹配到这个抽象方法上
-
@Functionalinterface 注解检测接口是否符合函数式接口
-
@FunctionalInterface//检测接口是否符合函数式接口 public interface USB { //创建接口 void service();//只能创建单个方法 }
-
3.函数式接口的使用
-
Function接口
-
Function<String,String> function1 = new Function<String, String>() { @Override public String apply(String s) { return s.toLowerCase();//将传入的大写字母转化为小写 } }; //使用Lambda表达式简化 Function<String,String> function = s->s.toLowerCase();//简写return
-
4.方法引用
- 方法引用是Lambda表达式的一种简写形式;
- 对象::实例方法
- 类名::静态方法
- 类名::实例方法
- 类名::new
5.Stream
- 流中保存对集合挥着数组数据的操作和集合类似,但集合中保存的是数据;
- Stream自身不会存储元素
- 不会改变源对象,
- Stream操作是延迟执行的,需要结果的时候才会执行
- 使用步骤
- 创建一个流
- 中间操作
- 在一个会多个步骤中,将初始Stream转化到另一个Stream的中间操作
- 终止操作
- 使用一个终止操作来产生一个结果,该操作会强制它之前的延迟操作立即执行。
- 只使用中间操作而不使用终止操作无法输出所需要的的数据
6.流的使用
-
ArrayList<String> arrayList = new ArrayList<>(); arrayList.add("西瓜"); arrayList.add("苹果"); arrayList.add("橘子"); Stream<String> stream = arrayList.parallelStream(); stream.forEach(System.out::println);
-
Stream<Integer> is = Stream.of(10, 20, 30, 40, 50); is.forEach(System.out::println);
-
//迭代流 Stream<Integer> iterate = Stream.iterate(0, x -> x + 2); iterate.limit