1.是什么
stream是java8中处理集合的关键抽象概念,对集合进行操作
使用声明式编程来处理集合的java接口,可以看作遍历数据集的高级迭代器。
- 集合是内存中的数据结构,所有的值都是已经计算好的;
- 流是一个概念上的数据结构,它的元素都是在使用到的时候才计算出来的。
- 集合是关于数据的,流是关于计算的;
- 集合是外部迭代,(外部迭代就是每次操作都要迭代一次);流是内部迭代,所有操作只需要一次操作。
- 集合可以多次使用,就像DVD;流只能使用一次,就像直播
2.为什么使用它
使用stream api 对集合进行操作,就像使用 sql 对数据库进行查询。stream api 提供了一种高效且易于使用的处理数据的方式
3.怎么使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqDjpMm2-1653960312383)(C:Userspengzhang1Desktop学习2stream.jpg)]
分类stream 操作分类
-
中间操作
- 无状态
unordered(),filter(),map(),mapToInt(),mapToLong(),mapToDouble(),flatMap(),flatMapToInt(),flatMapToLong(),flatMapToDouble(),peek()
- 有状态
distinct(),sorted(),limit(),skip()
-
约束操作
- 非短路操作
forEach(),forEachOrdered(),toArray(),reduce(),collect(),max(),min(),count()
- 短路操作
anyMatch(),allMatch(),noneMatch(),findFirst(),findAny()
无状态:指元素的处理不受之前元素的影响
有状态:指该操作只有拿到所有元素之后才能继续下去
非短路操作:指必须处理所有元素才能得到最终结果
短路操作:指遇到某些符合条件的元素就可以的得到最终的结果
package com.zp.demo1;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class streamdemo1 {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public streamdemo1(String name, Integer age) {
this.name = name;
this.age = age;
}
public streamdemo1() {
}
@Override
public String toString() {
return "streamdemo1{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
public static void main(String [] args) throws FileNotFoundException {
//1.使用collection 下的stream()和parallelStream()方法
ArrayList list = new ArrayList<>();
Stream stream = list.stream();//获取一个顺序流
Stream parallelStream = list.parallelStream();//获取一个并行流
//2.使用Arrays中的stream()方法,将数组转换成流
Integer[] integers = new Integer[10];
Stream stream1 = Arrays.stream(integers);
//3.使用stream中的静态方法,of(),iterator(),generate()
Stream integerStream = Stream.of(1, 2, 3, 4, 5);//of()方法
Stream stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println);//iterate()方法
Stream stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);//generate()方法
//4.BufferedReader.lines()方法,将每行内容转化成流
BufferedReader bufferedReader = new BufferedReader(new FileReader("E:\test.txt"));
Stream linesStream = bufferedReader.lines();
linesStream.forEach(System.out::println);
//5.Pattern.splitAsStream()方法,将字符串分隔成流
Pattern patter = Pattern.compile(",");
Stream stringStream = patter.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);
}
}
中间操作
package com.zp.demo1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class streamdemo2 {
public static void main(String[] args){
Stream integerStream = Stream.of(1, 1, 2, 2, 3, 3, 4, 5, 6, 7);
Stream integerStream1 = integerStream.filter(s -> s > 1)//把小于1的过滤了
.distinct()//去重
.skip(3)//从2开始跳过3个
.limit(2);//只显示两个
integerStream1.forEach(System.out::println);
List strings = Arrays.asList("a,b,c", "1,2,3");
//map
//将每一个元素转换成一个新的且不带逗号的元素
Stream stringStream = strings.stream().map(s -> s.replaceAll(",", ""));
stringStream.forEach(System.out::println);
//flatMap
Stream stream3 = strings.stream().flatMap(s -> {
//将每一个元素转换成一个stream
String[] split = s.split(",");
Stream stream = Arrays.stream(split);
return stream;
});
stream3.forEach(System.out::println);
List strings1 = Arrays.asList("aa", "bb", "ff", "cc");
strings1.stream().sorted().forEach(System.out::println);
streamdemo1 s1 = new streamdemo1("aa",10);
streamdemo1 s2 = new streamdemo1("cc",11);
streamdemo1 s3 = new streamdemo1("bb",13);
streamdemo1 s4 = new streamdemo1("aa",12);
streamdemo1 s5 = new streamdemo1("ee",14);
List streamdemo1s = Arrays.asList(s1, s2, s3, s4, s5);
//自定义排序,先按姓名升序,姓名相同后按年龄
streamdemo1s.stream().sorted(
(o1,o2)->{
if (o1.getName().equals(o2.getName())){
return o1.getAge() - o2.getAge();
}else{
return o1.getName().compareTo(o2.getName());
}
}
).forEach(System.out::println);
streamdemo1 streamdemo1 = new streamdemo1("aa",12);
streamdemo1 streamdemo2 = new streamdemo1("aa",11);
List streamdemo1s1 = Arrays.asList(streamdemo1, streamdemo2);
streamdemo1s1.stream().peek(o->o.setAge(100)).forEach(System.out::println);
List arrayList =Arrays.asList(1, 2, null, 3,2, null, 3, 4, 5, 6, 7,8);
System.out.println("sum is:"+arrayList.stream().filter(num -> num != null)
.distinct().mapToInt(num -> num * 2)
.peek(System.out::println).skip(2).limit(6).sum()
);
}
}
终端操作
package com.zp.demo1;
import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;
public class streamdemo3 {
public static void main(String [] args){
List integers = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = integers.stream().allMatch(e -> e > 10);
boolean noneMatch = integers.stream().noneMatch(e -> e > 6);
boolean anyMatch = integers.stream().anyMatch(e -> e > 4);
System.out.println("allMatch:"+allMatch);
System.out.println("noneMatch:"+noneMatch);
System.out.println("allMatch:"+anyMatch);
Integer findFirst = integers.stream().findFirst().get();
Integer findAny = integers.stream().findAny().get();
System.out.println("findFirst:"+findFirst);
System.out.println("findAny:"+findAny);
long count = integers.stream().count();
Integer max = integers.stream().max(Integer::compareTo).get();
Integer min = integers.stream().min(Integer::compareTo).get();
System.out.println("count:"+count);
System.out.println("max:"+max);
System.out.println("min:"+min);
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24);
Integer reduce1 = list.stream().reduce((x1, x2) -> x1 + x2).get();
System.out.println("reduce1:"+reduce1);
Integer reduce2 = list.stream().reduce(10, (x1, x2) -> x1 + x2);
System.out.println("reduce2:"+reduce2);
Integer reduce3 = list.stream().reduce(0,
(x1, x2) -> {
System.out.println("stream accumulator:x1:" + x1 + " x2:" + x2);
return x1 - x2;
},
(x1, x2) -> {
System.out.println("stream combiner: x1:" + x1 + " x2:" + x2);
return x1 * x2;
});
System.out.println("reduce3:"+reduce3);
Integer reduce4 = list.parallelStream().reduce(0,
(x1, x2) -> {
System.out.println("parallelStream accumulator: x1:" + x1 + " x2:" + x2);
return x1 - x2;
},
(x1, x2) -> {
System.out.println("parallelStream combiner: x1:" + x1 + " x2:" + x2);
return x1 * x2;
});
System.out.println("reduce4:"+reduce4);
streamdemo1 a1 = new streamdemo1("aaa", 10);
streamdemo1 b1 = new streamdemo1("bbb", 11);
streamdemo1 c1 = new streamdemo1("ccc", 12);
List list2 = Arrays.asList(a1, b1, c1);
//装成list
List agelist = list2.stream().map(streamdemo1::getAge).collect(Collectors.toList());
System.out.println("ageList:"+agelist);
agelist.forEach(System.out::println);
//转成set
Set ageSet = list2.stream().map(streamdemo1::getAge).collect(Collectors.toSet());
System.out.println("ageSet:"+ageSet);
//转成map:key不能相同,否则报错
Map tomap = list2.stream().collect(Collectors.toMap(streamdemo1::getName, streamdemo1::getAge));
System.out.println("tomap:"+tomap);
//字符串分隔符连接
String collect = list2.stream().map(streamdemo1::getName).collect(Collectors.joining(",", "(", ")"));
System.out.println("collect:"+collect);
//聚合操作
//1,学生总数
Long count1 = list2.stream().collect(Collectors.counting());
//2,年纪最大,(最小年龄minby)
Integer maxage = list2.stream().map(streamdemo1::getAge).collect(Collectors.maxBy(Integer::compare)).get();
//3.所有人的年纪
Integer sumage = list2.stream().collect(Collectors.summingInt(streamdemo1::getAge));
//4.平均年龄
Double aveAge = list2.stream().collect(Collectors.averagingDouble(streamdemo1::getAge));
//带上以上所有的方法
DoubleSummaryStatistics sumAll = list2.stream().collect(Collectors.summarizingDouble(streamdemo1::getAge));
System.out.println("count1:"+sumAll.getCount()+",max:"+sumAll.getMax()+",sum:"+sumAll.getSum()+",min:"
+sumAll.getMin()+",ave:"+sumAll.getAverage());
//分区
//分成两部分:一部分是大于等于11,一部分小于11
Map> parmap = list2.stream().collect(Collectors.partitioningBy(v -> v.getAge() >= 11));
System.out.println("parmap:"+parmap);
//规约
Integer allage = list2.stream().map(streamdemo1::getAge).collect(Collectors.reducing(Integer::sum)).get();
System.out.printf("allage:", allage);
System.out.println("allage = " + allage);
}
}
Grouping by
一个或多个属性对集合中的项目进行分组
stream1.是什么
stream是java8中处理集合的关键抽象概念,对集合进行操作
使用声明式编程来处理集合的java接口,可以看作遍历数据集的高级迭代器。
- 集合是内存中的数据结构,所有的值都是已经计算好的;
- 流是一个概念上的数据结构,它的元素都是在使用到的时候才计算出来的。
- 集合是关于数据的,流是关于计算的;
- 集合是外部迭代,(外部迭代就是每次操作都要迭代一次);流是内部迭代,所有操作只需要一次操作。
- 集合可以多次使用,就像DVD;流只能使用一次,就像直播
2.为什么使用它
使用stream api 对集合进行操作,就像使用 sql 对数据库进行查询。stream api 提供了一种高效且易于使用的处理数据的方式
3.怎么使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tk1fB1lP-1653960313239)(C:Userspengzhang1Desktop学习2stream.jpg)]
分类stream 操作分类
-
中间操作
- 无状态
unordered(),filter(),map(),mapToInt(),mapToLong(),mapToDouble(),flatMap(),flatMapToInt(),flatMapToLong(),flatMapToDouble(),peek()
- 有状态
distinct(),sorted(),limit(),skip()
-
约束操作
- 非短路操作
forEach(),forEachOrdered(),toArray(),reduce(),collect(),max(),min(),count()
- 短路操作
anyMatch(),allMatch(),noneMatch(),findFirst(),findAny()
无状态:指元素的处理不受之前元素的影响
有状态:指该操作只有拿到所有元素之后才能继续下去
非短路操作:指必须处理所有元素才能得到最终结果
短路操作:指遇到某些符合条件的元素就可以的得到最终的结果
package com.zp.demo1;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class streamdemo1 {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public streamdemo1(String name, Integer age) {
this.name = name;
this.age = age;
}
public streamdemo1() {
}
@Override
public String toString() {
return "streamdemo1{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
public static void main(String [] args) throws FileNotFoundException {
//1.使用collection 下的stream()和parallelStream()方法
ArrayList list = new ArrayList<>();
Stream stream = list.stream();//获取一个顺序流
Stream parallelStream = list.parallelStream();//获取一个并行流
//2.使用Arrays中的stream()方法,将数组转换成流
Integer[] integers = new Integer[10];
Stream stream1 = Arrays.stream(integers);
//3.使用stream中的静态方法,of(),iterator(),generate()
Stream integerStream = Stream.of(1, 2, 3, 4, 5);//of()方法
Stream stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);
stream2.forEach(System.out::println);//iterate()方法
Stream stream3 = Stream.generate(Math::random).limit(3);
stream3.forEach(System.out::println);//generate()方法
//4.BufferedReader.lines()方法,将每行内容转化成流
BufferedReader bufferedReader = new BufferedReader(new FileReader("E:\test.txt"));
Stream linesStream = bufferedReader.lines();
linesStream.forEach(System.out::println);
//5.Pattern.splitAsStream()方法,将字符串分隔成流
Pattern patter = Pattern.compile(",");
Stream stringStream = patter.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);
}
}
中间操作
package com.zp.demo1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
public class streamdemo2 {
public static void main(String[] args){
Stream integerStream = Stream.of(1, 1, 2, 2, 3, 3, 4, 5, 6, 7);
Stream integerStream1 = integerStream.filter(s -> s > 1)//把小于1的过滤了
.distinct()//去重
.skip(3)//从2开始跳过3个
.limit(2);//只显示两个
integerStream1.forEach(System.out::println);
List strings = Arrays.asList("a,b,c", "1,2,3");
//map
//将每一个元素转换成一个新的且不带逗号的元素
Stream stringStream = strings.stream().map(s -> s.replaceAll(",", ""));
stringStream.forEach(System.out::println);
//flatMap
Stream stream3 = strings.stream().flatMap(s -> {
//将每一个元素转换成一个stream
String[] split = s.split(",");
Stream stream = Arrays.stream(split);
return stream;
});
stream3.forEach(System.out::println);
List strings1 = Arrays.asList("aa", "bb", "ff", "cc");
strings1.stream().sorted().forEach(System.out::println);
streamdemo1 s1 = new streamdemo1("aa",10);
streamdemo1 s2 = new streamdemo1("cc",11);
streamdemo1 s3 = new streamdemo1("bb",13);
streamdemo1 s4 = new streamdemo1("aa",12);
streamdemo1 s5 = new streamdemo1("ee",14);
List streamdemo1s = Arrays.asList(s1, s2, s3, s4, s5);
//自定义排序,先按姓名升序,姓名相同后按年龄
streamdemo1s.stream().sorted(
(o1,o2)->{
if (o1.getName().equals(o2.getName())){
return o1.getAge() - o2.getAge();
}else{
return o1.getName().compareTo(o2.getName());
}
}
).forEach(System.out::println);
streamdemo1 streamdemo1 = new streamdemo1("aa",12);
streamdemo1 streamdemo2 = new streamdemo1("aa",11);
List streamdemo1s1 = Arrays.asList(streamdemo1, streamdemo2);
streamdemo1s1.stream().peek(o->o.setAge(100)).forEach(System.out::println);
List arrayList =Arrays.asList(1, 2, null, 3,2, null, 3, 4, 5, 6, 7,8);
System.out.println("sum is:"+arrayList.stream().filter(num -> num != null)
.distinct().mapToInt(num -> num * 2)
.peek(System.out::println).skip(2).limit(6).sum()
);
}
}
终端操作
package com.zp.demo1;
import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;
public class streamdemo3 {
public static void main(String [] args){
List integers = Arrays.asList(1, 2, 3, 4, 5);
boolean allMatch = integers.stream().allMatch(e -> e > 10);
boolean noneMatch = integers.stream().noneMatch(e -> e > 6);
boolean anyMatch = integers.stream().anyMatch(e -> e > 4);
System.out.println("allMatch:"+allMatch);
System.out.println("noneMatch:"+noneMatch);
System.out.println("allMatch:"+anyMatch);
Integer findFirst = integers.stream().findFirst().get();
Integer findAny = integers.stream().findAny().get();
System.out.println("findFirst:"+findFirst);
System.out.println("findAny:"+findAny);
long count = integers.stream().count();
Integer max = integers.stream().max(Integer::compareTo).get();
Integer min = integers.stream().min(Integer::compareTo).get();
System.out.println("count:"+count);
System.out.println("max:"+max);
System.out.println("min:"+min);
List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24);
Integer reduce1 = list.stream().reduce((x1, x2) -> x1 + x2).get();
System.out.println("reduce1:"+reduce1);
Integer reduce2 = list.stream().reduce(10, (x1, x2) -> x1 + x2);
System.out.println("reduce2:"+reduce2);
Integer reduce3 = list.stream().reduce(0,
(x1, x2) -> {
System.out.println("stream accumulator:x1:" + x1 + " x2:" + x2);
return x1 - x2;
},
(x1, x2) -> {
System.out.println("stream combiner: x1:" + x1 + " x2:" + x2);
return x1 * x2;
});
System.out.println("reduce3:"+reduce3);
Integer reduce4 = list.parallelStream().reduce(0,
(x1, x2) -> {
System.out.println("parallelStream accumulator: x1:" + x1 + " x2:" + x2);
return x1 - x2;
},
(x1, x2) -> {
System.out.println("parallelStream combiner: x1:" + x1 + " x2:" + x2);
return x1 * x2;
});
System.out.println("reduce4:"+reduce4);
streamdemo1 a1 = new streamdemo1("aaa", 10);
streamdemo1 b1 = new streamdemo1("bbb", 11);
streamdemo1 c1 = new streamdemo1("ccc", 12);
List list2 = Arrays.asList(a1, b1, c1);
//装成list
List agelist = list2.stream().map(streamdemo1::getAge).collect(Collectors.toList());
System.out.println("ageList:"+agelist);
agelist.forEach(System.out::println);
//转成set
Set ageSet = list2.stream().map(streamdemo1::getAge).collect(Collectors.toSet());
System.out.println("ageSet:"+ageSet);
//转成map:key不能相同,否则报错
Map tomap = list2.stream().collect(Collectors.toMap(streamdemo1::getName, streamdemo1::getAge));
System.out.println("tomap:"+tomap);
//字符串分隔符连接
String collect = list2.stream().map(streamdemo1::getName).collect(Collectors.joining(",", "(", ")"));
System.out.println("collect:"+collect);
//聚合操作
//1,学生总数
Long count1 = list2.stream().collect(Collectors.counting());
//2,年纪最大,(最小年龄minby)
Integer maxage = list2.stream().map(streamdemo1::getAge).collect(Collectors.maxBy(Integer::compare)).get();
//3.所有人的年纪
Integer sumage = list2.stream().collect(Collectors.summingInt(streamdemo1::getAge));
//4.平均年龄
Double aveAge = list2.stream().collect(Collectors.averagingDouble(streamdemo1::getAge));
//带上以上所有的方法
DoubleSummaryStatistics sumAll = list2.stream().collect(Collectors.summarizingDouble(streamdemo1::getAge));
System.out.println("count1:"+sumAll.getCount()+",max:"+sumAll.getMax()+",sum:"+sumAll.getSum()+",min:"
+sumAll.getMin()+",ave:"+sumAll.getAverage());
//分区
//分成两部分:一部分是大于等于11,一部分小于11
Map> parmap = list2.stream().collect(Collectors.partitioningBy(v -> v.getAge() >= 11));
System.out.println("parmap:"+parmap);
//规约
Integer allage = list2.stream().map(streamdemo1::getAge).collect(Collectors.reducing(Integer::sum)).get();
System.out.printf("allage:", allage);
System.out.println("allage = " + allage);
}
}
Grouping by
一个或多个属性对集合中的项目进行分组



