目录
Stream流
Stream流的三类方法
1.获取Stream流 2.中间方法 3.终结方法
Stream流的获取方法
单列集合:
Colection接口中的默认方法stream()生成流
代码:default Stream<E> stream()
集合对象.stream()
双列集合:
间接的生成流
可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
keySet:先获取所有的键,再把这个Set集合中所有的键放到Steam流中
代码:集合对象.keySet().stream()
集合对象.entrySet().stream()
数组:
Arrays中的静态方法stream生成流
代码:Arrays.stream(数组名)
同类数据类型的多个数据:
Stream.of(数据1,数据2,数据3)
Stream的filter方法
filter方法会获取流中的 每一个数据
而test方法中的s,就会一次表示流中的每一个数据
只需要在test方法中对s进行判断就可以了
如果结果为true,则当前的数据留下
如果判断的结果为false,则当前数据就不要
ArrayList<String> WoManActors = new ArrayList<>();
WoManActors.add("郑爽");
WoManActors.add("李冰冰");
WoManActors.add("杨宁");
WoManActors.add("薇苇");
WoManActors.add("杨敏");
WoManActors.add("赵紫薇");
Stream<String> woman = WoManActors.stream().filter(s -> s.startsWith("杨"));
//结果为:判断以杨字开始的名字,杨宁和杨敏
Stream流中间操作方法
Stream<T> filter(条件判断):用于对流中的数据进行过滤
Stream<T> limit(长度):返回此流中的元素组成的流,截取前指定参数个数的数据
Stream<T> skip(long n):跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static <T> Stream<T> concat(Stream a, Stream b):合并a和b两个流为一个流
Stream<T> distinct():返回由该流的不同元素(根据Object.equals(Object) )组成的流
limit方法和skip方法
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("张无忌");
list.add("王二麻子");
list.add("谢广坤");
list.add("二麻子");
list.add("三丰");
list.add("张丰");
list.add("李四");
list.add("王五");
list.add("老刘");
list.add("老六");
list.add("老七");
list.add("老八");
list.add("嗨嗨嗨");
Stream<T> limit(long maxSize):截取指定参数个数的数据,保留前面的
list.stream().limit(2).forEach(s-> System.out.println(s));
//
Stream<T> skip(long n):跳过指定参数个数的数据,跳过前面的
list.stream().skip(2).forEach(s-> System.out.println(s));
concat方法和distinct方法
ArrayList<String> list2 = new ArrayList<>();
ArrayList<String> list = new ArrayList<>();
list.add("张无忌");
list.add("王二麻子");
list.add("谢广坤");
list.add("二麻子");
list.add("张三丰");
list2.add("张无忌");
list2.add("王二麻子");
list2.add("谢广坤");
list2.add("二麻子");
list2.add("张三丰");
Stream<String> stream = list.stream();
Stream<String> stream2 = list2.stream();
//合并stream和stream2并打印出来
Stream.concat(list.stream(),list2.stream()).forEach(s-> System.out.println(s));
//打印每一个元素但不能重复
list.stream().distinct().forEach(s-> System.out.println(s));
Stream流终结操作方法
void forEach():对此流的每个元素执行操作
long count():返回此流中的元素数
ArrayList<String> list = new ArrayList<>();
list.add("张无忌");
list.add("王二麻子");
list.add("谢广坤");
list.add("二麻子");
list.add("刘备");
list.add("张飞");
list.add("张翠华");
list.add("王二麻子");
list.add("张良");
// methodForEach(list);
//count():返回此流中的元素数
long count = list.stream().count();
System.out.println(count);
//打印list流中的所有元素
list.stream().forEach(s-> System.out.println(s));
Stream流的收集操作
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
R collect(Collector collector) :把结果收集到集合中
工具类方法名:
public static <T> Collector toList():把元素收集到List集合中
public static <T> Collector toSet():把元素收集到Set集合中
public static Collector toMap(keyMapper,valueMapper):把元素收集到Map集合中
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <=10 ; i++) {
list.add(i);
list.add(10);
list.add(10);
list.add(10);
list.add(10);
list.add(10);
list.add(10);
list.add(10);
}
//filter负责过滤数据得
//collect负责收集数据
//获取流中剩余得数据,但是他不负责创建容器,也不负责把数据添加到容器中
//Collectors.toList():在底层会创建一个List集合,并把所有得数据添加到List集合中
List<Integer> collect = list.stream().filter(number -> number % 2 == 0).collect(Collectors.toList());
System.out.println(collect);
Set<Integer> set = list.stream().filter(number -> number % 2 == 0).collect(Collectors.toSet());
System.out.println(set);
}
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");
Map<String, Integer> map = list.stream().filter(
s -> {
String[] split = s.split(",");
int age = Integer.parseInt(split[1]);
return age >= 24;
}
).collect(Collectors.toMap(
s -> s.split(",")[0],
s -> Integer.parseInt(s.split(",")[1]) ));
System.out.println(map);
}