文章目录
- java Stream流
- 单列集合
- 双列集合
- 数组
- 可变参数
- filter
- 什么是filter
- 从代码中理解filter
- 截取元素 limt()
- 跳过指定参数个数的数据 skip()
- 拼接 concat(流1,流2)
- 去重 distinct
- 排序 sorted
- 升序
- 降序
- 统计数据元素 count()
- 收集Stream流的数据
- List
- Set
- Map
java Stream流
单列集合
创建一个ArrayList 集合,里面存储四个数据,调用 s t r e a m \color{pink}{stream} stream,其中forEach是打印输出。
ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张三丰","张飞","曹操","孙尚香");list.stream().forEach(s -> System.out.println(s));
双列集合
创建一个HashMap集合,里面存储对应的Key,Vlaue ,遍历人名。
HashMap<Integer,String> hm = new HashMap<>();hm.put(1,"张三丰");hm.put(2,"张飞");hm.put(3,"曹操");hm.put(4,"孙尚香");Set<Integer> set = hm.keySet();set.stream().forEach(s-> System.out.println(hm.get(s)));
数组
创建一个数组,存储1,2,3 值,使用 s t r e a m ( a r r ) \color{pink}{stream(arr)} stream(arr),遍历数组。
Integer[] arr = {1,2,3};
Arrays.stream(arr).forEach(s-> System.out.println(s));
可变参数
直接将数据放入 S t r e a m . o f \color{pink}{Stream.of} Stream.of中,遍历数据。
Stream.of(1,2,3,4,5,6,7).forEach(s-> System.out.println(s));
filter
什么是filter
filter(函数式接口)
filter方法会拿到流中的每一个数据
把每一个数据传递到Lambda表达式的形参s
如果返回的是false就丢弃,如果返回的是true留下来
首先我们创建一个ArrayList集合,里面存储一些数据,方便我们后续使用
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"1","2","3","4","5","5","1");
从代码中理解filter
list.stream().filter((String s)->{return true;}).forEach(s -> System.out.println(s));
解释: f i l t e r ( ( S t r i n g \color{red}{filter((String} filter((String s ) − > { r e t u r n \color{red}{s)->{\{return }} s)−>{return t r u e ; } ) \color{red}{true;\})} true;})
s 代表集合中存储的每一个数据,而true 表示每一个数据都会保留。
截取元素 limt()
list.stream().limit(3).forEach(s-> System.out.println(s));
解释: 表示截取前三个元素,只遍历前三个数据。
跳过指定参数个数的数据 skip()
list.stream().skip(3).forEach(s-> System.out.println(s));
解释:跳过前三个元素,遍历后面的元素。
拼接 concat(流1,流2)
Stream<String> stream1 = list.stream().limit(3);
Stream<String> stream2 = list.stream().skip(3);
Stream.concat(stream1,stream2).forEach(s-> System.out.println(s));
解释:将 s t r e a m 1 , s t r e a m 2 \color{red}{stream1,stream2} stream1,stream2流进行拼接打印。
去重 distinct
保证元素的唯一性。
list.stream().distinct().forEach(s-> System.out.println(s));
排序 sorted
升序
默认升序
list.stream().sorted().forEach(s-> System.out.println(s));
降序
list.stream().sorted(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return Integer.parseInt(o2)-Integer.parseInt(o1);}}).forEach(s-> System.out.println(s));
解释:使用匿名内部类,Comparator并重写compar()方法,使用o2-o1,因为我们上面存储的数据是String类型,我们将类型转化为int类型。
统计数据元素 count()
list.stream().count();
收集Stream流的数据
stream的方法并不改变原有的集合。
存储数据,方便我们下面理解。
ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,2,3,4,5,5,6);
collect方法只负责收集数据,而真正创建集合对象是Collectors.toList
List
List<Integer> newList = list.stream().filter(s -> s > 3).collect(Collectors.toList());
System.out.println(newList);
解释:filter里面的数据是,只要数据中大于3的元素。将大于3的元素存储在一个新的集合newList中。
Set
Set<Integer> set = list.stream().skip(3).collect(Collectors.toSet());
System.out.println(set);
解释:跳过原有list集合中的前三个元素,将其余元素存储在set集合中,由于Set集合的特性,自动给剩余的元素去重,保证元素的唯一性。
Map
Map集合理解起来有些难度,我直接在代码中写注释。
ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"zhangsan,23","lisi,24","wangwu,25");//创建一个Arraylist的集合,里面存储3个数据Map<String, Integer> map = list.stream().filter(s -> {String[] strings = s.split(",");//将ArrayList集合中的数据,使用,分割开,存储到strings的数组中int age = Integer.parseInt(strings[1]);//由于上面的数据已经分割存储到数组中,strings[1]中存储的是数字字符串,23,24,25,//这里我们将String类型转换为int类型return age >= 24;//只要年龄大于等于24的数据// }).collect(Collectors.toMap(Function类型的数据,Function类型的数据));}).collect(Collectors.toMap((String s) -> {return s.split(",")[0];//这里返回的是Map的键Key lisi,wangwu},(String s) -> {return Integer.parseInt(s.split(",")[1]);//这里返回的是Map的值Value 24,25}));System.out.println(map) ;
学的不是技术,更是梦想!!!