这节课开始我们开始学Java8的另一个特性: Stream API
首先说明,这玩意依然用的不多,但是,还是希望大家知道有这么个东西。
什么是Stream API? 就是java8给我们提供了一个新的类叫Stream,这个类可以用来很方便的操作一组数据(集合、数组)。
下面看代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;
public class Teach01 {
public static void main(String[] args) {
/**
* 先来看看API文档。
* 首先,既然StreamAPI是java8的新特性,所以看java1.6的API文档是看不到的,要看1.8的
*
* 先来看看创建流的几个方法吧:
*
* 1. Collection有个方法stream()可以用来创建流
*
* 2. Arrays.stream()静态方法
*
* 3. Stream.of()静态方法
*
* 4. 无限流
* 通过Stream.iterate()或generat()方法产生无限流
*/
//1. Collection有个方法stream()可以用来创建流
List<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
list.add(String.valueOf(i));
}
//List是Collection的子接口,自然也有这个stream()方法
Stream<String> stream1 = list.stream();
//2. Arrays.stream()静态方法
String[] strings = new String[]{"1","2","3"};
Stream<String> stream2 = Arrays.stream(strings);
//3. Stream.of()静态方法'
Stream<Integer> stream3 = Stream.of(1, 2, 3);
//4. 无限流
//通过Stream.iterate()或generat()方法产生无限流
/**
* @param seed 种子
* 此参数将会被作为第二个参数的未实现方法的参数然后不断被执行
* @param f UnaryOperator类型
* UnaryOperator<T,T>继承Function<T,R>接口
* 所以UnaryOperator中未实现的抽象方法为T apply(T t)
*
*/
Stream<Integer> stream4 = Stream.iterate(0, (t) -> { return t + 2; });
/**
* iterate原理类似如下
* List iterate(Object seed,UnaryOperator f)
* {
* List list = new ArrayList();
* Object i = seed;
* int count = 0;
* while(true)
* {
* //这个maxsize就是limit里的,如果不设置就会陷入死循环不断地生成数据
* if(count >= maxsize)
* {
* break;
* }
* list.add(i);
* i = f.apply(i);
*
* }
* return list;
* }
*
*/
/**
* @Param s Supplier类型
* 未实现的抽象方法为: T get();
* generate就是用哪个get()不断的产生数据,同样可以用limit()控制数量
*/
Stream<Integer> stream5 = Stream.generate(() -> { return (new Random()).nextInt(); });
/**
* 接下来介绍常用方法:
* 1. forEach
* @Param action Consumer类型
* 未实现的方法为void accept(T t);
*
* 2. limit()
* @Param maxsize int
* 限制流操作的数据的个数
*/
//stream4.forEach(System.out::println);
//无限生成,所以叫无限流
stream4.limit(10).forEach(System.out::println);
}
}