1、Lambda表达式
Arrays.asList(),alt+enter快速创建一个集合。()可以传值,会保存到创建的集合中
不是所有的匿名内部类都能用lambda表达式写,因为接口里可能不止一个方法
能用Lambda表达式写的都可以写成匿名内部类
1.1 介绍
● Lambda表达式是一种没有名字的函数,是Java 8 发布的最重要新特性。
● 本质上是一段匿名内部类,也可以是一段可以传递的代码。
● 还有叫箭头函数的…
1.2 特点
● 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。
public static void main(String[] args) {
List<Integer> list = Arrays.asList(2, 5, 3, 4,6);
// integer代表list的每一项,如果如多个参数需要写在()里
// 箭头后面代表对interger参数的操作,
// 如果只有一行操作不用加{}
// 有多个操作必须加大括号
list.forEach(integer -> System.out.println(integer));
System.out.println("========================== ");
list.forEach((integer) -> {
integer+=2;
System.out.println(integer);
});
}
● integer代表list的每一项,如果如多个参数需要写在()里
● 箭头后面代表对interger参数的操作,
● 如果只有一行操作不用加{}
● 有多个操作必须加大括号
● 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值
● 如果只有一条语句,并且是返回值语句,就可以不写return 不写 {}
● 如果写上{} 就必须写return 和 ;
● 如果有 多条语句,必须写{} return 和 ; 也必须写
2、函数式接口
@FunctionalInterface标记这个接口是一个函数式接口
其本质是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口是仅制定一个抽象方法的接口
3、Stream API
概念
● 数据渠道、管道,用于操作数据源(集合、数组等)所生成的元素序列。
● 集合讲的是数据,流讲的是计算
● 即一组用来处理数组,集合的API。
特点
● Stream 不是数据结构,没有内部存储,自己不会存储元素。
● Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
● Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
创建stream的五种方法
● 1、Stream.of(数组)
● 2、list的成员方法stream()
● 3、Stream.generate()
● 4、Stream.iterate()
● 5、String类的成员方法chars
中间算子
● filter:过滤,满足条件的留下
● distinct:去重
● limit:取前几个
● skip:跳过几个
● sorted:排序
● map:遍历集合对每一项进行操作
List list = Arrays.asList(2, 4, 3, 5, 1,5,4);
//1、filter过滤满足条件的留下
Stream<Integer> stream = list.stream();
stream.filter(x->{
if (x<4){
return true;
}else {
return false;
}
}).forEach(x-> System.out.println(x));
System.out.println("=======================");
//2、distinct 去重
stream = list.stream();
stream.distinct().forEach(x-> System.out.println(x));// stream has already been operated upon or closed
System.out.println("=======================");
//3、skip 跳过
stream = list.stream();
stream.skip(2).forEach(x-> System.out.println(x));
System.out.println("=======================");
//4、limit 限制只取限制的个数
stream = list.stream();
stream.limit(2).forEach(x-> System.out.println(x));
System.out.println("=======================");
//5、sorted
stream = list.stream();
stream.sorted((x,y)->y-x).forEach(x-> System.out.println(x));
System.out.println("=======================");
//6、map
stream = list.stream();
stream.map(x->x+"~~~").forEach(x-> System.out.println(x));
}
终止算子
foreach
public static void main(String[] args) {
List<Integer> list = Arrays.asList(2, 4, 3, 5, 1,5,4,8);
//1、min第一个值
Stream<Integer> stream = list.stream();
Optional<Integer> min = stream.map(x -> x + 2).min((x, y) -> y - x);
Integer integer = min.get();
System.out.println(integer);
System.out.println("===================");
//2、max最后一个值
stream = list.stream();
Optional<Integer> max = stream.map(x -> x + 2).max((x, y) -> y - x);
Integer integer1 = max.get();
System.out.println(integer1);
System.out.println("======================");
//3、求元素序列长度
stream = list.stream();
long count = stream.count();
System.out.println(count);
System.out.println("======================");
//4、average
stream = list.stream();
System.out.println("======================");
//5、collect 收集器,可以返回一个list或者set
stream = list.stream();
List<Integer> list1 = stream.map(x -> x + 10).collect(Collectors.toList());
System.out.println(list1);
}