简介
Stream是Java 8的新特性。Stream让开发者能够以一种声明的方式处理数据源,将处理的数据源看做一种Stream(流),Stream(流)在Pipeline(管道)中传输和运算,支持的运算包含筛选、排序、聚合等,当到达终点后便得到最终的处理结果。
Lambda表达式简介
简而言之,Lambda表达式可以用来实现匿名类,简化了代码。
举例:
测试用的函数式接口
package algorithm;
/**
* 测试用的函数式接口(只有一个抽象方法的接口)
* @author : kun
* @date : 2021/2/26
*/
@FunctionalInterface
public interface Person {
void run(String name,int age);
}
lambda表达式使用举例:
package algorithm;
import java.util.Arrays;
import java.util.List;
/**
* 测试lambda表达式
* @author : kun
* @date : 2021/2/26
*/
public class TestLambda {
public static void main(String[] args) {
//1、lambda代替匿名内部类
Person person = (name,age) -> {
age = age+1;
System.out.println(name+"明年就"+age+"岁了");
};
person.run("张三",11);
//2、lambda表达式遍历集合 每个元素+1并输出
List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(item -> {
item += 1;
System.out.println(item);
});
}
}
双冒号是lambda表达式的一种简化形式,当lambda表达式实现函数与其他静态类或者实现类的方法有相同个数或形式入参的时候,可以简化表达,使用
类名(实例名) :: 方法名 如果方法为静态方法或者构造方法,冒号前为类名,如果方法为实例方法,冒号前为实例名
Stream的使用步骤
1、Stream的构建
常见的构建方式
//数组:调用静态方法Stream.of()或者Arrays.stream()
Stream stream1 = Stream.of(1,2,3);
//集合对象:调用stream()串行流或者parallelStream()创建并行流
List<String> list = Arrays.asList("a","b","c");
Stream<String> stream2 = list.stream();
2、中间操作
filter
过滤掉某些元素,生成一个新的流
例如,筛选出List里大于30的元素
List<Integer> myList = list.stream().filter(i->i>30).collect(Collectors.toList());
map
对元素进行某种形式的转换
例如,将数组内的元素由Integer转为String
List<String> strList = list.stream().map(i->String.valueOf(i)).collect(Collectors.toList());
flatmap
如果map中对元素操作的函数返回的是一个流,但我们需要得到元素的集合,可以用flatMap进行合并,然后转换为一个集合
List<Integer> intgeterList = streamList.values().stream()
.flatMap(i->i.stream()).collect(Collectors.toList());
limit
返回一个包含前n个元素的新的流,总元素小于n则返回原始流
List<Integer> myList = list.stream().limit(3).collect(Collectors.toList());
skip
跳过前n个元素,与limit相反
用limit和skip可以达到一个分页的效果,方法传入一页展示多少个元素pageSize以及页码pageNumber
List<Integer> page = list.stream()
.skip(pageNumber*pageSize)
.limit(pageSize).collect(Collectors.toList());
distinct
去重
sorted
排序
3、终止操作
首先是通过流中的元素,计算出想要的值,使用完这些方法之后流会被关闭
reduce
对流中的元素按照规则计算
例如:求和运算
Integer sum = stream1.reduce(Integer::sum).get();
max/min
返回流中最大值/最小值,返回类型为java.util.Optional,调用一下get()可以拿到具体值
Integer num = stream1.filter(i -> i > 1).max(Integer::compareTo).get();
findFirst/findAny
返回流中第一个值/任何一个匹配的元素,返回类型为java.util.Optional
anyMatch/allMatch/noneMactch
返回boolean,判断流中是否有匹配的元素
anyMatch存在匹配的元素,返回true
allMatch所有元素符合匹配规则,返回true
noneMatch没有元素匹配,返回true
或者,我们想要将流转为集合
例如:
收集流中数据到List中
List<Integer> collect = stream1.collect(Collectors.toList());
可指定为ArrayList
ArrayList<Integer> collect = stream1.collect(Collectors.toCollection(ArrayList::new));
将流中的字符换拼接起来
String collect = stream2.collect(Collectors.joining());
用"-"拼接
String collect = stream2.collect(Collectors.joining("-"));
其他的用法会在以后工作中用到再进行补充~