Stream: 得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流.

把 集合/数组转换为流式结构,使用流中的方法进行操作.
“Stream流” 其实是一个集合元素的函数模型,其本身并不存储任何元素。

1.流式思想:

创建一个流式的模式,按照模式对数据进行操作.

Java流布局添加菜单项 java流模式_数组

2.获取流方式:

a. Stream(): 根据Collection集合获取Stream流. (所有实现类均可获取)
b.Static of(T…Values): 把一些可变参数(底层-数组) 变为Stream流.
c.Map集合也可以先把转为Set集合(keySet , entrySet) , 再用Stram操作.

3.常用方法:

  • 终结方法: 返回值类型不在是Stream    例: count , forEach.
  • 非终结方法: 返回值类型仍然是 Stream ,因此支持链式调用
1.forEach(Consumer<? super T> action): 对Stream流中元素进行遍历.
 2.Count(): 统计元素个数 . 返回long , 终止流.
 3.filter(Predicate<? super T> predicate): 对Stream流进行过滤.
 4.limit(获取个数): 获取前几个.
 5.skip(跳过个数): 跳过前几个.
 6.map(Function <T,R> fun): 将当前流中的T类型数据转换为另一种R类型的流。
 7.concat(Stream a , Stream b) : 将两个流合并为一个流.

4.收集Stream结果:

收集到集合中:
        List集合: Stream.Collect(Collectors.toList()):
        Set集合:Stream.Collect(Collectors . toSet( ) ):
 收集到数组中:
        Object[ ] obj = Stream.toArray();
        转换为string[ ]数组:Stream.toArray(new String[3]);

Stream流综合案例:

/* 
  练习:
        现在有两个ArrayList集合存储队伍当中的多个成员姓名,
            1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
            2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
            3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
            4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
            5. 将两个队伍合并为一个队伍;存储到一个新集合中
            6. 根据姓名创建Person对象;存储到一个新集合中
*/            
 public class Demo02StreamTest {
    public static void main(String[] args) {
        // 第一个队伍 . 
        List<String> one = new ArrayList<>();
        one.add("迪丽热巴"); one.add("宋远桥"); one.add("苏星河");
        one.add("庄子"); one.add("孙子"); one.add("洪七公");

        //  1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中
        //  2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中
        Stream<String> stringStream = one.stream().filter(name -> name.length() == 3).limit(3);

        // 第二个队伍
        List<String> two = new ArrayList<>();
        two.add("古力娜扎");
        two.add("张无忌");
        two.add("张三丰");
        two.add("赵丽颖");
        two.add("张二狗");
        two.add("张天爱");
        two.add("张三");

        // 3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中
        // 4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中
        Stream<String> skip = two.stream().filter(name -> name.startsWith("张")).skip(2);

        // 5. 将两个队伍合并为一个队伍;存储到一个新集合中
        // 6. 根据姓名创建Person对象;存储到一个新集合中
        // 7. 打印整个队伍的Person对象信息。
        Stream.concat(stringStream,skip).map(Person::new).forEach(System.out::println);
    }
}