什么是Stream
流(Stream)是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。集合讲的是数据,流讲的是计算。
-
!
-
1.Stream自己不会存储元素。
2.Stream不会改变源对象。相反,他们会返回一个持有结果的新Stream。
3.Stream操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。
创建流的方式
- 通过Collection系列集合提供的stream()或parallelStream()
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
- 通过Arrays中的静态方法sream()获取数组流
String[] strArray=new String[10];
Stream<String> stream2 = Arrays.stream(strArray);
- 通过Stream类的静态方法of()
Stream<String> stream3 = Stream.of("西部","北京","南昌","成都","重庆");
- 创建无限流 -> 迭代
Stream<Integer> stream4 = Stream.iterate(0, (i)->i+10);
stream4.limit(10).forEach(System.out::println);
- 创建无限流 -> 生成
Stream.generate(()->Math.round(Math.random()*50))
.filter((i)->i>25)
.limit(5)
.forEach(System.out::println);
中间操作
中间操作不会有任何结果,比如中间操作后再终止操作foreach()方法后就会有结果。
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理。而在终止操作时一次性全部处理,称为“惰性求值”。
筛选与切片
-
筛选与切片
-
filter: 接收Lambda,从流中排除某些元素
limit: 截断流,使某元素不超过给定数量
skip(n): 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。与limit(n)互补
distinct: 筛选,通过流所生成元素的hashCode()和equals()去除重复元素
List<Person> list = Arrays.asList(
new Person("小孩",100),
new Person("hon",320),
new Person("xs",30),
new Person("测试孩",0),
new Person("下下周",50),
new Person("成功vs",60));
@Test
public void t24() {
list.stream()
.filter((i)->i.getAge()>50)
.forEach(System.out::println);
}
映射与排序
-
映射
-
map: 接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
flatMap: 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
排序
-
sorted(): 自然排序
sorted(Comparator com): 定制排序
自然排序:
@Test
public void t24() {
List<Integer> a = Arrays.asList(1,4,32,654,432,67,856,543,756,2245);
a.stream()
.sorted()
.forEach(System.out::println);
}
定制排序:
@Test
public void t24() {
List<Integer> a = Arrays.asList(1,4,32,654,432,67,856,543,756,2245);
a.stream()
.sorted((o1,o2)->{
return o1>o2?-1:o1<o2?1:0;
})
.forEach(System.out::println);
}
List<Person> list = Arrays.asList(
new Person("小孩",100),
new Person("hon",320),
new Person("xs",30),
new Person("as",30),
new Person("下下周",50),
new Person("成功vs",60));
@Test
public void t24() {
list.stream()
.sorted((o1,o2)->{
if(o1.getAge()==o2.getAge()) {
return o1.getName().compareTo(o2.getName());
}else {
return o1.getAge().compareTo(o2.getAge());
}
}).forEach(System.out::println);
}
终止操作
-
查找与匹配
-
allMatch: 检查是否匹配所有元素
anyMatch: 检查是否至少匹配一个元素
noneMatch: 检查是否没有匹配所有元素
findFirst: 返回第一个元素
findAny: 返回当前流中的任意元素
count: 返回流中元素的总个数
max: 返回流中最大值
min: 返回流中最小值