Stream流可以用来简化集合和数组中的一些操作方法
来个案列热热身
找出集合中姓张的三位数名字的人
import java.util.ArrayList;
import java.util.List;
public class Test_01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周强强");
list.add("张三");
list.add("花无缺");
list.add("张三丰");
//思路:遍历集合如果符合要求的就将它加入新的集合中
List<String> list2 = new ArrayList<>();
for(String a: list) {
if(a.length() == 3 && a.startsWith("张")) {
list2.add(a);
}
}
for(String ss : list2) {
System.out.println(ss);
}
}
}
接下来看一下Stream流怎么完成
import java.util.ArrayList;
import java.util.List;
public class Test_01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周强强");
list.add("张三");
list.add("花无缺");
list.add("张三丰");
//一行代码找出
list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
}
}
一行代码就可以解决
画图助理解
它类似一条传送带在传输的过程中进行筛选和其他工作想象一下工厂的传送带
怎么获取Stream流呢?
//获取Collection集合的流
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
//map集合获取流
Map<String,Integer> map = new HashMap<String,Integer>();
//获取键的流
Stream<String> s1 =map.keySet().stream();
//获取值的流
Stream<Integer> s2 = map.values().stream();
//获取键值对的流
Stream<Map.Entry<String, Integer>> s3 = map.entrySet().stream();
//获取数组的流
String[] arr = new String[] {"张三","李四","王五","马六"};
Stream<String> s4 = Arrays.stream(arr);
Stream<String> s5 = Stream.of(arr);
常用api
//有这么一个集合
List<String> li = new ArrayList<String>();
li.add("张三");
li.add("天山童姥");
li.add("张无忌");
li.add("张三丰");
li.add("花无缺");
//找出姓张的人,并打印
li.stream().filter(sa -> sa.startsWith("张")).forEach(System.out::println);
//count():计数。找出姓张的有多少人
long i = li.stream().filter(sa -> sa.startsWith("张")).count();
System.out.println("姓张的一共有"+i+"人");
//skip(int i)跳过符合条件的前i个找出姓张的且跳过前两个人
li.stream().filter(sa -> sa.startsWith("张")).skip(2).forEach(System.out::println);
//limit(int i) 得到符合结果的前i个
li.stream().filter(sa -> sa.startsWith("张")).limit(2).forEach(System.out::println);
//打印结果:
张三
张无忌
张三丰
姓张的一共有3人
张三丰
张三
张无忌
map()方法,将传递进来的元素进行加工
//将所有的元素加上一个你好
li.stream().map(ss -> "你好:"+ss).forEach(System.out::println);
//输出结果
你好:张三
你好:天山童姥
你好:张无忌
你好:张三丰
你好:花无缺
concat()合并流
//将o1和o2流合并成o3
Stream<String> o1 = list1.stream();
Stream<String> o2 = list2.stream();
Stream<String> o3 = Stream.concat(o1,o2);
问题来了,我们通过Stream可以做什么呢?就是普通进行遍历吗?
其实不然Stream流主要是我们可以将它作为一种处理集合中元素的一种方法,主要在经过Stream的处理后我们往往是需要将它转换为原本的集合的,那么又是怎样将它转换为集合的。
它来了
收集流:
直接看一下代码就ok,不需要我们知道底层的原理,只要会用就行了
//先来一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("霍元甲");
list.add("孙悟空");
list.add("王五");
list.add("王五");
/*需求:
找出名字为两个字的人,将他们写入一个新的集合
此时用Stream流来进行处理
*/ //Stream转换为List集合
Stream<String> ss = list.stream().filter(s -> s.length() == 2);
//将Stream流转换为List集合
List<String> list2 = ss.collect(Collectors.toList());
System.out.println(list2);
//!注意,这个流在使用过后就不可以使用了,因为他已经流完了
//打印结果为[张三,李四,王五,王五]
//使用流来进行筛选出名字个数为2的人,并且放进set集合
//Stream转换为Set集合
Stream<String> ss1 = list.stream().filter(s -> s.length() == 2);
Set<String> set2 = ss1.collect(Collectors.toSet());
System.out.println(set2);
//打印结果:[张三,李四,王五]
//将Stream流转换为数组
Integer[] arr = {1,2,3,4,5,6,7,8}; //有一个数组,通过流来取到偶数
Stream<Integer> file = Arrays.stream(arr).filter(i -> i%2 == 0);
//将Stream流转换为数组
Object[] arr2 = file.toArray();
for(Object s: arr2) {
System.out.println(s);
}
实际开发中我们使用基本都是集合,一般是不适用Stream来进行数据的交互的,因此我们都是要将Stream流集合成集合或者数组的。