集合的处理数据的弊端
当我们需要对集合中的元素进行操作的时候,除了必要的增、删、查外,最典型的就是遍历,,我们来体验下操作记得的弊端,需求如下:
-
拿到所有姓张的
-
拿到长度小于3的,打印出来
代码如下
public static void main(String[] args) {
List<String> listName = new ArrayList();
Collections.addAll(listName,"张无忌","周芷若","赵敏","张强","张三丰","金轮法王");
List<String> zhangList = new ArrayList();
for (String name :listName){
if(name.contains("张")){
zhangList.add(name);
}
}
System.out.println(zhangList);
List<String> threeList = new ArrayList();
for (String name :zhangList){
if(name.length()<3){
threeList.add(name);
}
}
System.out.println(threeList);
}
Stream流的思想概述
注意: Stream 流和IO流(inputStream/outStream)没有任何关系,请暂停忘记对传统IO流的固有印象。
stream流式思想概述
stream流式思想类似于工厂车间的“生产流水线”, stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线的一个工序。在流水线上, 通过多个工序让一个原材料加工成一个商品。

这张图中展示了过滤、映射、跳过、计数等多步操作,这是一种集合元素的处理方案,而方案就是一种“函数模型”。图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个流模型。而最右侧的数字 3是最终结果。
这里的 filter 、 map 、 skip 都是在对函数模型进行操作,集合元素并没有真正被处理。只有当终结方法 count 执行的时候,整个模型才会按照指定策略执行操作。
Stream流能够让我们能够快速的完成许多复杂的操作,如筛选、切片、映射、查找、去重、统计、匹配和规约等。
获取Stream流的方式
java.util.stream.Stream<T> 是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)
获取一个流非常简单,有以下几种常用的方式:
* 所有的Collection 集合都可以通过stream 默认方法获取流;
* Stream 接口的静态方法of 可以获取数组对应的流。
方式1 : 根据Collection 获取流
首先,java.util.Collection 接口中加入了default方法stream 用来获取流,所以其所有实现类均可获取流。
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
public static void main(String[] args) {
//方式1 : 根据Collection获取流
//Collection接口有一个默认的方法,default Stream<E> stream()
List<String> list = new ArrayList();
Stream<String> stream = list.stream();
Set<String> set = new HashSet();
Stream<String> stream2 = set.stream();
Map<String,String> map = new HashMap<>();
Stream<String> stream3 = map.keySet().stream();
Stream<String> stream4 =map.values().stream();
Stream<Map.Entry<String, String>> stream5 = map.entrySet().stream();
}
方式二: Stream中的静态方法of获取流
由于数组对象不可能添加默认方法, 所以Stream 接口中提供了静态方法of, 使用方法如下:
public static void main(String[] args) {
//方式2 : Stream静态方法of获取流
Stream<String> stream6 = Stream.of("aa", "bb", "cc");
String[] str = {"11","22","33"};
Stream<String> stream7 = Stream.of(str);
//基本数据类型的数组行不行?不行的,会将整个数组看做一个元素进行操作
int[] arr = {11,22,33};
Stream<String> stream8 = Stream.of(str);
}