什么是Stream宋欺?
Stream將要處理的元素集合看作一種流,在流的過程中雪营,借助Stream API對流中的元素進行操作弓千,比如:篩選、排序献起、聚合等洋访。
image.png
如何創(chuàng)建Stream
list.stream() //轉(zhuǎn)換成流進行操作
Stream 操作符的分類
主要分為兩種:中間操作符和結(jié)束操作符
中間操作符:Lambda表達式的鏈式操作,可以鏈式對流進行操作谴餐,操作完后還是返回流
結(jié)束操作符:用來結(jié)束流的姻政,數(shù)據(jù)經(jīng)過中間加工操作,最后通過結(jié)束操作符對數(shù)據(jù)進行收集或者消費的岂嗓,數(shù)據(jù)到了結(jié)束操作這里就不會向下流動了汁展,結(jié)束操作符只能使用一次
中間操作符例子
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
/**
* 用于去掉重復(fù)的元素
*/
@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);
}
//創(chuàng)建了一個字符流轉(zhuǎn)換的方法
public static Stream<Character> getCharacter(String str){
ArrayList<Character> list = new ArrayList<>();
for (Character character : str.toCharArray()) {
list.add(character);
}
return list.stream();
}
流扁平化,讓你把一個流中的“每個值”都換成另一個流摄闸,然后把所有的流連接起來成為一個流總結(jié): 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);
//---------------------------數(shù)字排序-------------------------------------
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
結(jié)束操作符例子
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
/**
* 用于循環(huán)
*/
@Test
public void forEach(){
List<String> list = Arrays.asList("孫宇峰","付凱","張劍","郭忠波","張三峰","xxx","付凱");
list.stream().forEach(s -> System.out.println(s));
}
4.collect
/**
* 用于將流轉(zhuǎn)換成其他類型的數(shù)據(jù):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
/**
* 獲取集合中元素的數(shù)量
*/
@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);