廖雪峰Java16函数式编程-2Stream-2创建Stream

1. 方法1:把一个现有的序列变为Stream,它的元素是固定的

    //1.直接通过Stream.of()静态方法传入可变参数进行创建
    Stream<Integer> s = Stream.of(1,2,3,4,5);
    //2.Arrays.stream(数组)把一个数组变为Stream
    Stream<Integer> s = Arrays.stream(theArray);
    //3.通过Collections的stream()方法,把任意的Collections(例如List,Set,Queue)变为Stream
    Stream<Integer> s = aList.stream();

2. 方法2: 通过Stream.generate方法根据一个Supplier对象不断产生下一个元素。这种Stream保留的是算法,可以表示无限序列。

    Stream<T> s = Stream.generate(Supplier<T> s);
class NaturalSupplier implements Supplier<BigInteger>{
    BigInteger next = BigInteger.ZERO;
    public BigInteger get(){
        next = next.add(Integer.ONE);
        return next;
    }
}
//表示全体自然数的Stream
Stream<BigInteger> s = Stream.generate(new NaturalSupplier());.
//对于无限数列,如果调用forEach,count最终求值的操作,会进入死循环,因为永远无法计算完这个序列
//s.forEach(System.out::println);
//因此将无限序列变为有限序列,如截取前100个元素再操作
s.limit(100).forEach(System.out::println);
import java.util.Arrays;

public class StreamBasic {
    public static void main(String[] args){
        String[] array = "JDK Stream API Supports functional-style operation".split(" ");
        long n = Arrays.stream(array)
//                .filter((s)->s.equals(s.toUpperCase()))
                .count();
        System.out.println("How many words?"+n); //全部是6,大写是2
    }
}

3. 方法3:很多API提供了Stream接口,可以直接返回Stream,例如

File.lines可以把一个文件变为Stream,每个元素代表文件的一行内容。

    try(Stream<string> lines = Files.lines(Paths.get("/path/to/access.log"))){
        ...
    }

正则表达式的splitAsStream可以把一个长字符串分割成Stream序列,而不是数组。

    String input = "a, b, c, dd  E, ff";
    Pattern pattern = Pattern.compile("\\s*\\,\\s*");
    Stream<String> s = pattern.splitAsStream(input);

4. 创建基本类型的Stream

因为Java的范型不支持基本类型,所以我们无法使用Stream这样的范型,会发生编译错误。
如果要使用基本类型,JDK提供了可以使用IntStream, LongStream, DoubleStream。设计IntStream, LongStream, DoubleStream的目的是为了提高运行效率,避免装箱和拆箱的额外操作。

    Stream<int> s: // 回报compile error
    IntStream is = IntStream.generater(IntSupplier s);
    LongStream ls = LongStream.generater(LongSupplier s);
    DoubleStream ds = DoubleStream.generater(DoubleSupplier s);

5. 总结

创建Stream的三种方法:

  • 通过指定元素/现有数组/现有collection创建
    * Stream.of(T... t)
    * Arrays.stream(array)
    * collections.strean()
  • 通过supplier创建无限序列
  • 通过其他类的相关方法创建

基本类型的Stream有IntStream/LongStream/DoubleStream

posted on 2019-09-07 10:55  singleSpace  阅读(215)  评论(0编辑  收藏  举报