06. Java8-流式API-中间操作

x33g5p2x  于2021-12-18 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(549)

流式三部曲-创建流

流可分为有限流和无限流两种, 有限流是指流中元素个数有限, 无限流指流中元素个数无限. 无论是有限流和无限流, 在进行终端操作之前都不会进行中间操作处理.

1. 有限流创建

1.1 通过集合创建流

通过list/set 自带的stream(), parallelStream() API可很方法的创建流.

// 创建有限流1: 通过集合(list,set) 获取流, Map 不能获取流
@Test
public void createByListSet(){

    // 使用list 创建并行流
    List<String> list = new ArrayList<>();
    Stream<String> listParallelStream = list.parallelStream();

    // 使用set 创建串行流
    Set<String> set = new HashSet<>();
    Stream<String> setStream = set.stream();

}

1.2 通过数组创建

数组可通过Arrays.stream()方法构建流, stream 方法有很多重载方法可用.

// 创建有限流2: 通过数组创建流
@Test
public void createByArray(){
    String[] array = new String[3];
    Stream<String> arrayStream = Arrays.stream(array);
    
    long[] longArray = new long[3];
    LongStream longStream = Arrays.stream(longArray);

    int[] intArray = new int[3];
    IntStream intStream = Arrays.stream(intArray);

    double[] doubleArray = new double[3];
    DoubleStream doubleStream = Arrays.stream(doubleArray);
}

1.3 通过Stream.of 创建

Stream.of 只能接收数组作为参数, 接收集合会把整个集合当做流中的一个元素.

// 创建有限流3: 通过Stream.of 方法创建流,参数为数组
@Test
public void createByConstants(){
    Stream<String> stream = Stream.of("java", "Linux", "mysql", "nginx");
    Stream<String> stream2 = Stream.of(new String[]{"a", "b", "c", "d"});

    stream.forEach(System.out::println);
    stream2.forEach(System.out::println);
}

1.4 通过文件获取流

// 创建有限流4: 通过文件获取流
@Test
public void createByFile() throws Exception{
    Stream<String> fileStream = Files.lines(Paths.get("pom.xml"));
    fileStream.forEach(System.out::println);
}

2. 无限流创建

2.1 生成式创建

// 创建无限流1: 生随机生产5个随机数
@Test
public void test_generate(){
    Stream<Double> stream = Stream.generate(Math::random).limit(5);
    stream.forEach(System.out::println);
}

2.2 迭代式创建

迭代式创建类似于递归

// 创建无限流2: 迭代式创建,(无限流通常需要配合limit使用,否则会无限创建)
@Test
public void test_iterate(){
    Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(5);
    stream.forEach(System.out::println);
}

//测试斐波那契数列
@Test
public void test_febinache(){

    Stream<Integer> stream = Stream
            .iterate(new int[]{0, 1}, t -> new int[]{t[1], t[0] + t[1]})
            .limit(8)
            .map(t -> t[0]);

    stream.forEach(System.out::println);
}

相关文章