天天看点

Lambda表达式八:Stream流二:Stream流的5种创建方式;

5种创建Stream流的方式;(PS:可以发现,背后大量使用了Lambda表达式;)

目录

第一种创建方式:Stream.of(arr):基于数组进行创建(常用)

(1)示例代码

(2)运行结果

(3)几点说明

 第二种创建方式:list.stream():基于集合进行创建(常用)

(1)示例代码

(2)运行结果

(3)几点说明

第三种创建方式:Stream.generate():利用generate()方法创建无限长度流(不常用)

(1)示例代码

(2)运行结果

(3)几点说明

(4)改进:limit()方法限制流的长度

第四种创建方式:Stream.iterate():利用iterate()方法,基于迭代器创建流(不常用)

 (1)案例代码

(2)运行结果

(3)几点说明

(4)改进:limit()方法限制流的长度

第五种创建方式:Stream.iterate():基于字符序列创建流(不常用)

(1)案例代码

(2)运行结果

(3)几点说明

(4)附加说明

Lambda表达式八:Stream流二:Stream流的5种创建方式;

第一种创建方式:Stream.of(arr):基于数组进行创建(常用)

(1)示例代码

package com.imooc.stream;

import org.junit.Test;

import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第一种创建方式:基于数组进行创建
     */
    @Test
    public void generator1() {
        String[] arr = {"Lily","Jack","Jordan","Gavin","张三"};
        // Stream中的静态方法of(),参数是可变参数(自然可以传入一个数组),返回值是一个Stream类型对象;
        // 需要增加一个泛型,说明数组中的数据类型;
        // 这样以后Stream流对象就创建好了,只有创建了这个Stream流对象,才能使用一系列流式处理的方法,来简化对数据的操作;
        Stream<String> stringStream = Stream.of(arr);
        stringStream.forEach(s -> System.out.println(s));
    }
}
           

(2)运行结果

Lambda表达式八:Stream流二:Stream流的5种创建方式;

(3)几点说明

(1)Stream中的of()方法
Lambda表达式八:Stream流二:Stream流的5种创建方式;
(2)@Test注解说明
Lambda表达式八:Stream流二:Stream流的5种创建方式;
(3)forEach()方法说明
Lambda表达式八:Stream流二:Stream流的5种创建方式;

……………………………………………………

 第二种创建方式:list.stream():基于集合进行创建(常用)

(1)示例代码

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第二种创建方式:基于集合进行创建
     */
    @Test
    public void generator2(){
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        Stream<String> stringStream = list.stream();
        stringStream.forEach(s -> System.out.println(s));
    }
}
           

(2)运行结果

Lambda表达式八:Stream流二:Stream流的5种创建方式;

(3)几点说明

(1)List和ArrayList类中虽然没有stream方法的,但是Collection接口中是有stream方法的,而List接口又继承了Collection接口:所以List对象可以直接调用stream方法得到Stream类型的对象
Lambda表达式八:Stream流二:Stream流的5种创建方式;

(2)这种方式,因为stream()方法就是集合中定义的方法,所以比较方便;

(3)【第一种创建方式:Stream.of(arr):基于数组进行创建】和【 第二种创建方式:list.stream():基于集合进行创建】是实际中最常使用的方法。接下来的三种方式使用的不多,只做一般性了解即可。

……………………………………………………

第三种创建方式:Stream.generate():利用generate()方法创建无限长度流(不常用)

(1)示例代码

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第三种创建方式:利用generate方法创建无限长度流
     */
    @Test
    public void generetor3() {
        Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(100000));
        stream.forEach(i -> System.out.println(i));

    }

}
           

(2)运行结果

Lambda表达式八:Stream流二:Stream流的5种创建方式;

(3)几点说明

(1)Stream中的generate()方法

generate()方法参数是一个Supplier函数式接口的实现,generate()的参数自然可以是一个Lambda表达式;Lambda表达式会创建一个新的对象,而这个新的对象会被纳入到生成的流中。

Lambda表达式八:Stream流二:Stream流的5种创建方式;
(2)Supplier函数式接口简单说明
Lambda表达式八:Stream流二:Stream流的5种创建方式;
Lambda表达式八:Stream流二:Stream流的5种创建方式;
(3)上面,利用generate()方法会创建一个无限长度的数据流;

(4)改进:limit()方法限制流的长度

无限长度的数据流本身是没有意义的,因为程序会停留在【stream.forEach(i -> System.out.println(i));】一直输出,程序不能正常的往下走了。

为了解决这个问题,在Stream中提供了另一个方法limit()方法:限制流的长度;

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {


    /**
     * 第三种创建方式:利用generate方法创建无限长度流;附带limit方法,限制流的长度;
     */
    @Test
    public void generetor3() {
        Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(100000));
        stream.limit(10).forEach(i -> System.out.println(i));
        System.out.println("**********");

    }

}
           
Lambda表达式八:Stream流二:Stream流的5种创建方式;
Lambda表达式八:Stream流二:Stream流的5种创建方式;
注:generate()创建无限长度数据流在实际中使用的是比较少的,就算使用也经常配合limit()方法来使用。

……………………………………………………

第四种创建方式:Stream.iterate():利用iterate()方法,基于迭代器创建流(不常用)

 (1)案例代码

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第四种创建方式:基于迭代器创建流
     */
    @Test
    public void generator4(){
        Stream<Integer> stream = Stream.iterate(1, n -> n + 1);
        stream.forEach(i -> System.out.println(i));
    }

}
           

(2)运行结果

Lambda表达式八:Stream流二:Stream流的5种创建方式;

(3)几点说明

(1)iterate()方法说明
Lambda表达式八:Stream流二:Stream流的5种创建方式;
Lambda表达式八:Stream流二:Stream流的5种创建方式;

(4)改进:limit()方法限制流的长度

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第四种创建方式:基于迭代器创建流;附带limit方法,限制流的长度;
     */
    @Test
    public void generator4(){
        Stream<Integer> stream = Stream.iterate(1, n -> n + 1);
        stream.limit(10).forEach(i -> System.out.println(i));
    }

}
           

运行结果:

Lambda表达式八:Stream流二:Stream流的5种创建方式;
注:这个案例非常常见于使用stream替代传统的for循环,但尽管如此,使用还是比较少的。

 ……………………………………………………

第五种创建方式:Stream.iterate():基于字符序列创建流(不常用)

(1)案例代码

package com.imooc.stream;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * Stream流对象的五种创建方式
 */
public class StreamGenerator {

    /**
     * 第五种创建方式:基于字符序列创建流
     */
    @Test
    public void generator5(){
        String str = "abcdefg嘿嘿";
        IntStream stream = str.chars();
        stream.forEach(c -> System.out.println(c));
    }

}
           

(2)运行结果

Lambda表达式八:Stream流二:Stream流的5种创建方式;

(3)几点说明

(1)chars()方法说明
Lambda表达式八:Stream流二:Stream流的5种创建方式;
Lambda表达式八:Stream流二:Stream流的5种创建方式;

(4)附加说明

背后原理:int整数和char是可以互相转换的

Lambda表达式八:Stream流二:Stream流的5种创建方式;
注:这种利用字符序列创建流的方式,在实际中使用的比较少。比如对字符进行数据加密时,或者搭建应用最底层框架时,即必须要对字符串的每一个字符进行处理时才会考虑使用这种方式。