strean只能被消费一次
三种创建方法
- 针对集合Collection, stream(), 接口当中定义的默认方法.
- Arrays.stream(T[] t), 把数组搞成一个Stream流
- Stream.of(T ... t), 将一系列的值转换为Stream对象
获取的三种方式:
返回值都是接口类型的: Stream, 那么返回的一定是: 实现了该接口的实现类的对象.
对象.方法(); // 不考虑静态的啥的.
Stream流的常用方法
点击查看代码
package com.qf.deom01;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
public class Test01 {
public static void main(String[] args) {
List<String> nameList =new ArrayList<>();
nameList.add("tom");
nameList.add("tomtomtomtomtomtomtomtom");
nameList.add("jack");
nameList.add("rose");
nameList.add("john");
nameList.add("old wang");
nameList.add("jerry");
nameList.add("li lei");
nameList.add("marry");
nameList.add("bird");
nameList.add("milk");
nameList.add("jerry");
nameList.add("li lei");
nameList.add("marry");
nameList.add("bird");
nameList.add("milk");
List<Integer> number =new ArrayList<>();
number.add(1);
number.add(2);
number.add(10);
number.add(5);
//找出”j的人“(filter)predicate->过滤
nameList.stream().filter(s ->s.startsWith("j")).forEach(s -> System.out.println(s));
System.out.println("---------------");
//把j的人转大写
nameList.stream().filter(s -> s.startsWith("j")).map(s->s.toUpperCase()).forEach(s -> System.out.println(s));
System.out.println("------------------------");
//跳过 ship
nameList.stream().filter(s -> s.startsWith("j")).skip(2).forEach(s -> System.out.println(s));
System.out.println("------------------------");
//去重distinct,表示对当前集合进行去除操作,重写equals和HashCode
nameList.stream().distinct().filter(s -> s.startsWith("j")).forEach(s -> System.out.println(s));
System.out.println("------------------------");
//peek,中间方法,可以进行遍历
nameList.stream().filter(s -> s.startsWith("j")).peek(s -> System.out.println(s)).
map(s -> s.toUpperCase()).forEach(s -> System.out.println(s));
//count计算集合种元素的数量,终结方法
System.out.println(nameList.stream().count());
/*//合并流
Stream<Stream> mySteam =Stream.of(nameList.stream(),listName.stream());
System.out.println(mySteam.count());*/
System.out.println("------------------------");
//findFirst,返会第一个元素
// Optional java8新特性,get表示储存在optional对象中的值
Optional<String> nameFirst =nameList.stream().peek(s -> System.out.println(s)).findFirst();
String str = nameFirst.get();
System.out.println(nameFirst.get());
System.out.println("------------------------");
//findAny返回任意元素
Optional optional =nameList.stream().findAny();
System.out.println(optional.get());
System.out.println("------------------------");
//// 10. anyMatch, allMatch ,noneMatch
//anyMatch任意元素匹配时
Boolean result=nameList.stream().anyMatch(s ->s.startsWith("t"));
System.out.println(result);
//allMath所有元素匹配
Boolean result2 =nameList.stream().allMatch(s -> s.length()>3);
System.out.println(result2);
//noneMatch所有元素都不匹配
Boolean result3 =nameList.stream().noneMatch(s -> s.equalsIgnoreCase("BBB"));
System.out.println(result3);
//reduce 参数传递是biFunction, R apply(T, U)
Integer tem=number.stream().reduce((s1,s2)->s2+s1).get();
System.out.println(tem);
//T identity//表示操作的基数
Integer tem2 =number.stream().reduce(100,(s1,s2)->s1+s2);
System.out.println(tem2);
// Integer sum = number.stream().reduce(100, (a, b) -> a - b, (a, b) -> a +b );
// System.out.println(sum);
System.out.println("------------------------");
// limit,从数据当中读出n条数据;中间数据
number.stream().limit(3).forEach(s->System.out.println(s));
number.stream().limit(3).peek(s->System.out.println("ttt"+s)).findFirst();//未加终结操作,无法打印peek
}
}
总结Stream常用方法
- filter
- map
- limit
- distinct()
- sorted, 两个
- anyMatch
- allMaatch
收集方法
- Stream接口当中定义了一个方法, 这个方法就是收集方法.
- Stream流当中的数据—> 还原成集合等/字符串/.
<R, A> R collect(Collector<? super T, A, R> collector)
这个方法的参数是一个接口: Collector.
public interface Collector<T, A, R> {}
提供了一个工具类: Collectors. 表示对Collector的封装
/ 1. 接口当中Stream定义了一个收集的方法;
collect(传递一个接口: Collector) // Collector接口有一个工具类,专门创建对象: Collectors
// Collectors当中提供了大量的静态方法,返回值就是Collector, 所以咱们可以直接把
Collectors.toList/toSet传入到collect方法当中
点击查看代码
将流转换为想要的集合
/**
*
*/
public class Test01 {
public static void main(String[] args) {
List<String> nameList =new ArrayList<>();
nameList.add("tom");
nameList.add("tomtomtomtomtomtomtomtom");
nameList.add("jack");
nameList.add("rose");
nameList.add("john");
nameList.add("old wang");
nameList.add("jerry");
nameList.add("li lei");
nameList.add("marry");
nameList.add("bird");
nameList.add("milk");
nameList.add("jerry");
nameList.add("li lei");
nameList.add("marry");
nameList.add("bird");
nameList.add("milk");
List<String> list=nameList.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
//collect可以将流转换为集合,参数为collector,这是一个接口,
//这个接口提供了一个工具类:Collectors这个工具类当中的静态方法返回的就是: 实现了
//Collector接口的实现类的对象.所以可以直接传入到Collect方法当中.\
list.forEach(s -> System.out.println(s));
System.out.println(list);
System.out.println("------------");
Set<String> set=nameList.stream().filter(s -> s.contains("l")).distinct().collect(Collectors.toSet());
System.out.println(set);
System.out.println("------------");
Object [] tl=nameList.stream().toArray();
System.out.println(Arrays.toString(tl));
System.out.println("------------------------------");
//Collections接口只有List/Set?????Collect
//toCollection当中传入的是一个Supplier接口.
ArrayList<String> arrayList=nameList.stream().collect(Collectors.toCollection(()->new ArrayList<>()));
HashSet<String>hashSet=nameList.stream().collect(Collectors.toCollection(()->new HashSet<>()));
将流转换为字符串
点击查看代码
/*Collectors.joining() // 默认没有分隔符
Collectors.joining("分隔符") // 默认没有分隔符
Collectors.joining("分隔符", "前缀", "后缀") // 默认没有分隔符*/
//将流转换为字符串
System.out.println("------------------------------");
String str = nameList.stream().filter(s -> s.length()>8).collect(Collectors.joining());
System.out.println(str);
System.out.println(nameList.stream().filter(s -> s.length()>4).collect(Collectors.joining(" ")));
System.out.println(nameList.stream().filter(s -> s.length()>4).
collect(Collectors.joining(" ","[","}")));
分组
简单分组partitioningBy(Boolean)
点击查看代码
package com.qf.deom03;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Test01 {
public static void main(String[] args) {
List<User> nameList = new ArrayList<>();
nameList.add(new User("卡卡罗特",118));
nameList.add(new User("贝吉塔",181));
nameList.add(new User("特兰克斯",8));
nameList.add(new User("悟饭",8));
nameList.add(new User("悟天",4));
nameList.add(new User("沙鲁",18));
nameList.add(new User("布罗利",38));
//partitioningBy(Boolean)
Map<Boolean,List<User>> mapUser=nameList.stream().collect(Collectors.partitioningBy(person->person.getName().contains("悟")));
mapUser.forEach((k,v)->{
System.out.println(k);
System.out.println(v);
}
);
}
}
结果
![image](/i/l/?n=23&i=blog/2326800/202304/2326800-20230401112211435-602612631.png)
按照你自定义的要求进行分析groupingBy
点击查看代码
package com.qf.deom03;
import java.util.*;
import java.util.stream.Collectors;
public class Test02 {
public static void main(String[] args) {
List<User> nameList = new ArrayList<>();
nameList.add(new User("卡卡罗特",118));
nameList.add(new User("贝吉塔",181));
nameList.add(new User("特兰克斯",8));
nameList.add(new User("悟饭",8));
nameList.add(new User("悟天",4));
nameList.add(new User("沙鲁",18));
nameList.add(new User("布罗利",38));
//groupingBy(可以自定义)
Map<String,List<User>> listMap =
nameList.stream().collect(Collectors.groupingBy(user -> user.getName().substring(0,2)));
//keyset遍历
Set<String> setUser =listMap.keySet();
for (String s : setUser) {
System.out.println(s);
List<User> users =listMap.get(s);
users.forEach(k->System.out.println(k));
}
System.out.println("-----------------------------");
//foreach遍历
listMap.forEach((k,v)->{
System.out.println(k);
System.out.println(v);
});
System.out.println(listMap.size());
System.out.println(nameList.size());
System.out.println("-----------------------------");
TreeMap<String, Set<User>> treeMap = nameList.stream()
.collect(Collectors.groupingBy(user -> user.getName().substring(0, 2),
() -> new TreeMap<>(),
Collectors.toSet()));
treeMap.forEach((k, v) -> {
System.out.println(k);
v.forEach(s -> System.out.println(s));
System.out.println("--------------------------");
});
}
}
结果
![image](/i/l/?n=23&i=blog/2326800/202304/2326800-20230401112552719-942751216.png)
数据统计summarizingInt
点击查看代码
package com.qf.deom03;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.stream.Collectors;
public class Test04 {
public static void main(String[] args) {
Integer[] score = {20, 48, 13, 56, 89, 32, 21, 23, 1, 23, 1, 432, 4, 235, 3, 43, 23, 123};
IntSummaryStatistics sum = Arrays.stream(score).collect(Collectors.summarizingInt(i->i));
System.out.println(sum.getSum()); // 求和
System.out.println(sum.getAverage()); // 平均数
System.out.println(sum.getMax()); // 最大值
System.out.println(sum.getMin()); // 最小值
System.out.println(sum.getCount()); // 元素的个数
}
}