先说steam流的特点:
1、Stream流一般不会改变数据源,只会生成一个新的数据流。
2、Stream流不会存储数据,只会根据设置的操作节点处理数据。
3、Stream流是延迟执行的,只有在调用终端操作后才会进行流转。
举个栗子
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周正若");
list.add("赵斌");
list.add("张强");
list.add("张三丰");
//获取集合中张开头并且长度为3的元素
list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).forEach(name -> System.out.println(name));
//结果 张无忌 张三丰
System.out.println("----------------------steam流手动分割1--------------------");
// 1.把所有“张”姓开头元素存储到新集合
List<String> list2 = list.stream().filter(name -> name.startsWith("张")).collect(Collectors.toList());
System.out.println(list2);
// [张无忌, 张强, 张三丰]
System.out.println("----------------------for循环手动分割1--------------------");
//或者for循环
List<String> list3 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张")){
list3.add(s);
}
}
System.out.println(list3);
// [张无忌, 张强, 张三丰]
// 2.把所有“张”姓开头且长度为3的元素存储到新集合
System.out.println("----------------------steam流手动分割2--------------------");
List<String> list4 = list.stream().filter(name -> name.startsWith("张")).filter(name -> name.length() == 3).collect(Collectors.toList());
System.out.println(list4);
//[张无忌, 张三丰]
System.out.println("----------------------for循环steam流手动分割2--------------------");
//或者for循环
List<String> list5 = new ArrayList<>();
for (String s : list) {
if (s.startsWith("张") && s.length() == 3){
list5.add(s);
}
}
System.out.println(list5);
//[张无忌, 张三丰]
System.out.println("----------------------手动分割4--------------------");
//单列集合获取Stream流
Collections.addAll(list, "a","b","c","d","e");
//获取到一个流水线,并把集合中的数据方法流水线上
//Stream<String> stream1 = list.stream();
//使用终结方法打印流水线上数据
//stream1.forEach( s ->System.out.println(s) );
list.stream().forEach(s -> System.out.println(s));
}
实现同一个需求,steam只需要一行代码就解决,经典for循环需要5行,看起来是比较优雅的,
缺点就是可读性较差,业务比较复杂的情况下,每一个steam在后期维护时可能都需要考虑
---------------------------------------------------------------