Stream流是Java 8 发布的对集合操作的特性。
函数式编程
主要概念:
- 数据源
指的是你要操作的集合数据 - 数据处理
指使用者要对数据源进行怎样的处理 - 收集结果
指处理完成后,把操作后的结果进行相应的处理
使用:
1、一般情况下对集合数据进行相应的分类操作:
这样写会使得代码复用率不高且繁琐
2、使用Stream流进行分类
2.1.通过list.stream()
拿到数据源
2.2.进行数据处理操作:
//先定义两个条件
Predicate<User> predicate1 = user -> user.getAge()<21;
Predicate<User> predicate2 = user -> user.getSalary()>2000;
//然后利用这两个条件来筛选数据源(filter用于进行数据筛选)
list.stream()
.filter(predicate1)
.filter(predicate2)
2.3.收集结果:
使用collect(Collectors.toList())
将上面操作的数据变为一个新的集合。总览如下:
(亦可进一步简化)
(下图这里使用or是或关系,使用and是且关系)
使用Lambda表达式
目的:为简化接口的编程方式
例如,传统的面向接口的编程方式,首先要有一个实现类,如要创建一个线程,首先要写一个Runnable的实现类,写其run方法,然后定义一个线程将其传进来,再启动线程。
==》若要将其简化,可使用匿名内部类的方式(即不自定义MyRunnable):
可在上面的基础上继续简化,new Thred()内看似是一个对象,实则为一个方法的实现,因而可直接传方法的实现,而不需要外层的东西,故而直接使用lambda表达式:
再进行简化:
即使用Lamdba表示式时不再需要写类只需要写最核心的东西
将Lambda表达式应用在stream流中
eg:
//下问出现的str、num等都是可以随便写的,其含义是自定义一个变量,用于接收集合中的每一个元素
//1、filter
//先定义三个数据源
List<String> list = Arrays.asList("Hello","World","Java");
//拿到数据源并做处理
list.stream()
.filter(str->str.length()>=5)
.forEach(str->System.out.println(str)); //循环输出
//结果会输出 Hello World
//2、limit
//用于指定元素不超过指定的数量,即进行截取
list.stream()
.limit(2) //这里是最大长度,即集合中最多两个
.forEach(str->System.out.println(str));
//结果会输出 Hello World
//3、sorted
//排序(默认升序排列)
List<Integer> list2 = Arrays.asList(1,6,2,3,5,4);
list2.stream()
.sorted()
.forEach(num->System.out.println(num));
//结果会输出 1 2 3 4 5 6
//若要进行降序输出,只需给sorted加参数即可:
.sorted(Comparator.reverseOrder())
//4、max、min、count
//求最大值,最小值、长度
//求最大值
System.out.println(list2.stream()
.max(Integer::compareTo).get()); //按照Integer的排序把最大的求出来,此时所得的为Optional的对象,需用get()方法调出
//求最小值
System.out.println(list2.stream()
.min(Integer::compareTo).get());
//求长度
System.out.println(list2.stream()
.count());
//结果会输出 6 1 6
//5、map
//对集合元素进行特定操作,然后传到map中
list2.stream()
.map(num->num+10) //对集合中每个元素进行加10操作
.forEach(num->System.out.println(num));
//结果会输出 11 12 13 14 15 16
//6、reduce
//将所有元素按传入的逻辑进行处理,将结果合并成一个值进行返回
System.out.println(list2.stream()
.reduce((sum,num)->sum+num).get()); //输出总和
//结果会输出 21
//7、collection
//基于目标集合生成新的集合(依据筛选条件)
List<Ingeter> collect = list2.stream()
.filter(num->num%2==0) //只取出偶数集合
.collect(Collectors.toList());
System.out.println(collect);
//结果会输出 [6,2,4]