Java Lambda从入门到精通十五 流的使用-创建流

流的创建主要分为四种:

  • 由值创建流
    • Stream.of()
      • Stream stream = Stream.of(“Java”, “Lambda “); stream.map(String::toUpperCase).forEach(System.out::println);
  • 由数组创建流
    • Arrays.stream()
      • int[] numbers = {1,2, 3, 4, 5,}; int sum = Arrays.stream(numbers).sum();
  • 由文件生成流
    • Stream lines(Path path)
  • 由函数生成流:创建无限流
    • Stream.iterate和Stream.generate
      • iterate
        • iterate方法接受一个初始值(在这里是0),还有一个依次应用在每个产生的新值上的Lambda(UnaryOperator类型)
      • generate
        • 接受一个Supplier类型的Lambda提供新的值

我们来看代码:

import java.util.function.IntSupplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 创建流
 */
public class StreamTest6 {

    public static void main(String[] args) {
        System.out.println("iterate生成流");
        Stream.iterate(0, n ->n+2)
                .limit(10)
                .forEach(System.out::println);

        System.out.println("iterate以数据交换的方式生成斐波那契流");
        Stream.iterate(new int[]{0,1}, n ->{
            //这里是用原数组替换值的方式,不断递增向后生成数列
            int sum = n[0]+n[1];
            n[0] = n[1];
            n[1] = sum;
            return n;
            }).limit(10)
                .forEach(t -> System.out.println("(" + t[0] + "," + t[1] +")"));

        System.out.println("iterate以流的方式生成斐波那契流");
        Stream.iterate(new int[]{0,1}, n ->new int[]{n[1],n[1]+n[0]})
                .limit(10)
                .forEach(n -> System.out.println("(" + n[0] + "," + n[1] +")"));


        //generate
        System.out.println("generate生成流");
        IntStream.generate(new IntSupplier(){
            @Override
            public int getAsInt() {
                return 5;
            }
        }).limit(10)
                .forEach(System.out::println);


    }
}

输出结果:

iterate生成流
0
2
4
6
8
10
12
14
16
18


iterate以数据交换的方式生成斐波那契流
(0,1)
(1,1)
(1,2)
(2,3)
(3,5)
(5,8)
(8,13)
(13,21)
(21,34)
(34,55)


iterate以流的方式生成斐波那契流
(0,1)
(1,1)
(1,2)
(2,3)
(3,5)
(5,8)
(8,13)
(13,21)
(21,34)
(34,55)


generate生成流
5
5
5
5
5
5
5
5
5
5