zoukankan      html  css  js  c++  java
  • 廖雪峰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

  • 相关阅读:
    css动画集合地址
    邮箱正则
    好用的工具之一 ---- Sublime Text
    组件化表单解决方案AForm 1.3 发布
    WinScp几个极大提高开发效率的小功能
    session的本质及如何实现共享?
    使用phantomjs操作DOM并对页面进行截图需要注意的几个问题
    Ubuntu 12.04 安装最新版本NodeJS
    IIS 8 nodejs + iisnode 配置
    Bagging和Boosting的介绍及对比
  • 原文地址:https://www.cnblogs.com/csj2018/p/11479567.html
Copyright © 2011-2022 走看看