什么是Stream?
Stream将要处理的元素集合看作一种流,在流的过程中,借助Stream API对流中的元素进行操作,比如:筛选、排序、聚合等。
image.png
如何创建Stream
list.stream() //转换成流进行操作
Stream 操作符的分类
主要分为两种:中间操作符和结束操作符
中间操作符:Lambda表达式的链式操作,可以链式对流进行操作,操作完后还是返回流
结束操作符:用来结束流的,数据经过中间加工操作,最后通过结束操作符对数据进行收集或者消费的,数据到了结束操作这里就不会向下流动了,结束操作符只能使用一次
中间操作符例子
1.filter
/**
* 用于过滤不满足条件的元素
*/
@Test
public void filter(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<String> filtered = list.stream().filter(str -> str.contains("峰")).collect(Collectors.toList());
System.out.println(filtered);
}
2.distinct
/**
* 用于去掉重复的元素
*/
@Test
public void distinct(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<String> distincted = list.stream().distinct().collect(Collectors.toList());
System.out.println(distincted);
}
3.limit
/**
* 用于获取前n个元素
*/
@Test
public void limit(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<String> limited = list.stream().limit(3).collect(Collectors.toList());
System.out.println(limited);
}
4.skip
/**
* 用于获取除前n个元素以外的所有元素
*/
@Test
public void skip(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<String> skiped = list.stream().skip(3).collect(Collectors.toList());
System.out.println(skiped);
}
5.map
/**
* 用于对所有元素进行集体的操作
*/
@Test
public void map(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<String> mapped = list.stream().map(str->"帅哥姓名是->"+str).collect(Collectors.toList());
System.out.println(mapped);
}
对流中的每一个元素进行处理
6.flatmap
/**
* 用于对所有元素进行扁平化的操作
*/
@Test
public void flatMap(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
List<Character> flatMaped = list.stream().flatMap(str -> javaStream.getCharacter(str)).collect(Collectors.toList());
System.out.println(flatMaped);
}
//创建了一个字符流转换的方法
public static Stream<Character> getCharacter(String str){
ArrayList<Character> list = new ArrayList<>();
for (Character character : str.toCharArray()) {
list.add(character);
}
return list.stream();
}
流扁平化,让你把一个流中的“每个值”都换成另一个流,然后把所有的流连接起来成为一个流总结: map是对一级元素进行操作,flatmap是对二级元素操作。
7.sorted
/**
* 用于对所有元素进行以a到z顺序进行排序
*/
@Test
public void sorted(){
//---------------------------字母排序-------------------------------------
List<String> list = Arrays.asList("abc","sd","as","few","wth","dfg","as");
List<String> sorted = list.stream().sorted().collect(Collectors.toList());//正序
List<String> collect1 = list.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.US))).collect(Collectors.toList());
System.out.println(sorted);
System.out.println(collect1);
//---------------------------汉字排序-------------------------------------
List<String> list3 = Arrays.asList("吕布","刘备","阿斗","赵云","张辽","马超","法正");
List<String> sorted1 = list3.stream().sorted(Collator.getInstance(Locale.CHINA)).collect(Collectors.toList());//正序
List<String> collect2 = list3.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA))).collect(Collectors.toList());
System.out.println(sorted1);
System.out.println(collect2);
//---------------------------数字排序-------------------------------------
List<Integer> list1 = Arrays.asList(1,5,9,54,33,-52,54);
List<Integer> collect = list1.stream().sorted().collect(Collectors.toList());//正序
Stream<Integer> sorted2 = list1.stream().sorted(Collections.reverseOrder());//反序
System.out.println(collect);
sorted2.forEach(s-> System.out.print(s+","));
}
image.png
and so on
结束操作符例子
1.anyMatch
/**
* 用于判断集合中是否有一个元素满足条件
*/
@Test
public void anyMatch(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
boolean a = list.stream().anyMatch(s -> s.contains("峰"));
System.out.println(a);
2.allMatch
/**
* 用于判断集合中是否所有元素都满足条件
*/
@Test
public void allMatch(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
boolean a = list.stream().allMatch(s -> s.contains("峰"));
System.out.println(a);
}
3.forEach
/**
* 用于循环
*/
@Test
public void forEach(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
list.stream().forEach(s -> System.out.println(s));
}
4.collect
/**
* 用于将流转换成其他类型的数据:list,map,set
*/
@Test
public void collect(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
Set<String> collect = list.stream().collect(Collectors.toSet());
System.out.println(collect);
}
5.count
/**
* 获取集合中元素的数量
*/
@Test
public void count(){
List<String> list = Arrays.asList("孙宇峰","付凯","张剑","郭忠波","张三峰","xxx","付凯");
long count = list.stream().count();
System.out.println(count);
}
6.groupingBy
/*分组*/
public static void group(){
Map<Integer, List<User>> map = users().stream()
.collect(Collectors.groupingBy(User::getSex));
System.out.println(new Gson().toJson(map));
System.out.println();
Map<Integer, Map<Integer,List<User>>> map2 = users().stream()
.collect(Collectors.groupingBy(User::getSex,
Collectors.groupingBy(User::getAge)));
System.out.println(new Gson().toJson(map2));
}
7.maxBy、minBy
public static void max_min(){
List<User> list = users();
Optional<User> max = list.stream()
.collect(
Collectors.maxBy(
Comparator.comparing(User::getAge)
)
);
Optional<User> min = list.stream()
.collect(
Collectors.minBy(
Comparator.comparing(User::getAge)
)
);
System.out.println("max--> " + max+" min--> "+ min);