本文介绍了如何产生J2SE 8的流, 包括基本类型的流IntStream, LongStream, DoubleStream 。

展现流的方法

  1. public static <T> void show(String title, Stream<T> stream){
  2. System.out.println("title:"+title);
  3. List<T> collect = stream.limit(10).collect(Collectors.toList());
  4. collect.forEach(n->System.out.println(n));
  5. System.out.println();
  6. }

创建公共的list

  1. ArrayList<String> arrayList = new ArrayList<>();
  2. arrayList.add("aa");
  3. arrayList.add("bb");
  4. arrayList.add("cc");

1. 产生流方式一  List.stream()   List->流

  1. Stream<String> listStream = arrayList.stream();
  2. show("listStream", listStream);

2. 产生流方式二  List.parallelStream() 并行流,可以在多线程中执行操作  List->流

  1. Stream<String> parallelListStream = arrayList.parallelStream();
  2. show("parallelListStream", parallelListStream);
不想出现流被关的错误,用Supplier<T> 包装流,直接get(),多次使用不会错

  1. Supplier<Stream<String>> arrayListSupplier = () -> arrayList.stream();
  2. show("arrayListSupplier", arrayListSupplier.get());
  3. show("arrayListSupplier", arrayListSupplier.get());
  4. show("arrayListSupplier", arrayListSupplier.get());

3. 产生流方式三  Pattern方式  字符串切割->流

  1. Stream<String> patternStream = Pattern.compile("\r\n").splitAsStream("11111\r\n22222\r\n33333\r\n6666666666666");
  2. show("patternStream", patternStream);

4. 产生流方式四  Files方式  文件->流

  1. Stream<String> fileStream = Files.lines(Paths.get("E:\\111.txt"),StandardCharsets.UTF_8); //StandardCharsets.UTF_8
  2. show("fileStream", fileStream);

5. 产生流方式五  Arrays.stream()  数组->流

  1. Stream<String> arrayStream = Arrays.stream(new String[]{"AA","BB","CC"});
  2. Arrays.stream(new String[]{"AA","BB","CC"},0,2); //T[] array, int startInclusive, int endExclusive 切割数组
  3. show("arrayStream", arrayStream);

6. 产生流方式六  Stream.of()   任意对象->流

  1. Stream.of(arrayList);
  2. Stream<String> ofStream = Stream.of("aa","bb","cc");
  3. show("ofStream", ofStream);

7. 产生流方式七  Stream.empty()  创建空流

  1. Stream<Object> emptyStream = Stream.empty();
  2. show("emptyStream", emptyStream);

8. 产生流方式八  Stream.generate()  产生无限流 无限长度的Stream,其元素的生成是通过给定的Supplier

  1. Stream<String> generateStream1 = Stream.generate(()->"AABBCC");
  2. show("generateStream1", generateStream1);
  3. Stream<Double> generateStream2 = Stream.generate(new Supplier<Double>() {
  4. @Override
  5. public Double get() {
  6. return Math.random();
  7. }
  8. });
  9. generateStream2 = Stream.generate(()->Math.random());
  10. generateStream2 = Stream.generate(Math::random);
  11. show("generateStream2", generateStream2);

9. 产生流方式九  iterate()    接受种子+函数

  1. Stream<BigInteger> iterateStream = Stream.iterate(BigInteger.ZERO, n->n.add(BigInteger.ONE));
  2. show("iterateStream", iterateStream);

10. 产生流方式十  IntStream

  1. IntStream intStream = IntStream.of(1,1,2,3,4);
  2. show("intStream", intStream.boxed()); //boxed() 基本类型流->对象流
  3. intStream = IntStream.range(0, 5); //[int startInclusive, int endExclusive),不包括5
  4. show("intStream", intStream.boxed());
  5. intStream = IntStream.rangeClosed(0, 5); //[int startInclusive, int endExclusive],包括5
  6. show("intStream", intStream.boxed());
  7. intStream = IntStream.generate(()->new Random().nextInt());
  8. show("intStream", intStream.boxed());
  9. intStream = IntStream.iterate(0, n->n+8);
  10. show("intStream", intStream.boxed());
  11. IntStream mapToIntStream = arrayList.stream().mapToInt(String::length); //mapToInt 将对象流->基本类型流
  12. show("mapToIntStream", mapToIntStream.boxed());

11. 产生流方式十一  LongStream

  1. LongStream longStream = LongStream.of(1,1,2,3,4);
  2. show("longStream", longStream.boxed()); //boxed() 基本类型流->对象流
  3. longStream = LongStream.range(0, 5); //[int startInclusive, int endExclusive),不包括5
  4. show("longStream", longStream.boxed());
  5. longStream = LongStream.rangeClosed(0, 5); //[int startInclusive, int endExclusive],包括5
  6. show("longStream", longStream.boxed());
  7. longStream = LongStream.generate(()->new Random().nextLong());
  8. show("longStream", longStream.boxed());
  9. longStream = LongStream.iterate(0, n->n+8);
  10. show("longStream", longStream.boxed());
  11. LongStream mapToLongStream = arrayList.stream().mapToLong(x->(long)x.length()); //mapToLong 将对象流->基本类型流
  12. show("mapToLongStream", mapToLongStream.boxed());

12. 产生流方式十二  DoubleStream

  1. DoubleStream doubleStream = DoubleStream.of(1.1,1.2,1.3,2.1,2.2);
  2. show("doubleStream", doubleStream.boxed());
  3. doubleStream = DoubleStream.generate(Math::random);
  4. show("doubleStream", doubleStream.boxed());
  5. doubleStream = DoubleStream.iterate(1.1, n->n+1.1);
  6. show("doubleStream", doubleStream.boxed());
  7. DoubleStream mapToDoubleStream = arrayList.stream().mapToDouble(x->(double)x.length()); //mapToDouble 将对象流->基本类型流
  8. show("mapToDoubleStream", mapToDoubleStream.boxed());


13. 对应的,创建short,char,byte,boolean,float流

  1. Stream<Boolean> booleanStream = Arrays.stream(new Boolean[]{true,false,false,true});
  2. show("booleanStream", booleanStream);

14.  流操作, 不要修改流操作中间引出的集合的值

  1. //不在流中修改arrayList,不要紧
  2. Stream<String> stream = arrayList.stream();
  3. arrayList.add("added stream");
  4. System.out.println(stream.count());
  5. //在流中修改arrayList,会 java.util.ConcurrentModificationException
  6. //arrayList.stream().forEach(s->arrayList.remove(s));

15. 并行流

使用并行流的条件:
1).操作可以以任意顺序执行, 顺序执行结果和不顺序执行的结果相同
2).操作可以分开执行,并行执行
  1. //生成并行流的两种方式
  2. Stream<String> parallelStream = arrayList.parallelStream();
  3. parallelStream = arrayList.stream().parallel();
  4. Map<Integer, Long> parallelStreamResult = parallelStream.filter(w->w.length()>1).collect(Collectors.groupingBy(String::length, Collectors.counting()));
  5. parallelStreamResult.entrySet().forEach((n)->System.out.println(n.getKey()+" , counting:"+n.getValue()));
  6. //unordered表示对排序不感兴趣, 打乱顺序
  7. arrayList.parallelStream().limit(2).forEach((n)->System.out.println(n));
  8. System.out.println();
  9. arrayList.parallelStream().unordered().limit(2).forEach((n)->System.out.println(n));





J2SE 8的流库 --- 生成流的更多相关文章

  1. J2SE 8的流库 --- 转换流, 得到的还是流

    流的转换, 按照条件过滤/映射/摊平/截取/丢弃/连接/去重/排序. 辅助方法 public static int myCompare(String x, String y) { if(x.lengt ...

  2. J2SE 8的流库 --- 基本类型流的使用

    展现流的方法 public static <T> void show(String title, Stream<T> stream){ System.out.println(& ...

  3. Java SE 8 流库

    1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...

  4. Java SE 8 流库(一)

    1. 流的作用 通过使用流,说明想要完成什么任务,而不是说明如何去实现它,将操作的调度留给具体实现去解决: 实例:假如我们想要计算某个属性的平均值,那么我们就可以指定数据源和属性,然后,流库就可以对计 ...

  5. Java SE 8 的流库学习笔记

    前言:流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图.如: //使用foreach迭代 long count = 0; for (String w : words) { if (w. ...

  6. Java高级特性1_流库_初体验

    Java高级特性流库_初体验 面对结果编程 在编程里, 有两种编程方式, 一种是面对过程编程, 一种是面对结果编程. 两者区别如下 面向过程编程 面向过程编程需要编程程序让程序依次执行得到自己想要的结 ...

  7. 用内存流 文件流 资源生成客户端(Delphi开源)

    正文:很多木马生成器就是用的内存流和文件流生成客户端的,废话不多说了,代码如下: unit Main; interface usesWindows, Messages, SysUtils, Varia ...

  8. Java SE 8 流库(二)

    1.3. filter,map,flatMAP方法 流的转换会产生一个新流,它的元素派生出自另一个流中的元素: Stream<T> filter(Predicate<? super ...

  9. 第01章-Java SE8的流库

    从迭代到流的操作 流表面上看起来和集合很类似,都可以让我们转换和获取数据,但是它们之间存在着显著的差异 流并不存储其元素,这些元素可能存储在底层的集合中,或者是按需生成的 流的操作不会修改其数据源 流 ...

随机推荐

  1. P1015回文数

    传送 回文数的判断有个神奇的公式: g[i]==g[leng+-i] 其中leng为字符串长度,看每个g[i]是否都满足它,若满足,就是回文数 ps:洛谷的impossible有毒,必须得复制题干中的 ...

  2. 查看app日志的方法

    可以打开SDk里面的 ddms.bat 查看日志 路径: android-sdk-macosx/tools/ddms SDK下载的地址: http://www.androiddevtools.cn/ ...

  3. 廖雪峰Java1-3流程控制-1输入输出

    1.输入 导入java.util.Scanner 创建Scanner对象并传入System.in 使用Scanner.nextLine()读取用户输入的字符串 Scanner.nextInt()读取用 ...

  4. 开启BBR加速

    在linux里用 wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh chmod +x b ...

  5. Jmeter(三十八)Jmeter Question 之 ‘批量执行SQL语句’

    知识使我们变得玩世不恭,智慧使我们变得冷酷无情,我们思考的太多,感知太少,除了机器,我们更需要人性,除了智慧,我们需要仁慈和善良. ------出自查理卓别林的演讲 前面有提到Jmeter使用JDBC ...

  6. java的几种引用

    强引用:无论内存是否足够,不会回收. 软引用:内存不足时,回收该引用关联的对象. 弱引用:垃圾回收时,无论内存是否足够,都会回收. 虚引用:任何时候都可能被垃圾回收器回收. 在Java中,虽然不需要程 ...

  7. android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能

    Androidstudio 出现以下错误导致layout xml无法实现预览功能: Information:Gradle tasks [:dl_version:generateDebugSources ...

  8. lesson

    需要深入研究:1.pinctrl子系统2.gpio子系统3.dtsi的处理架构4.printk的log级别和log机制5.中断子系统6.console是什么?log来自哪里?7.kernel命令行参数 ...

  9. matlab 画图参考小程序

    x=0.1:0.1:0.9; a=[41.37,44.34,44.34,44.66,44.66,44.66,98.85,98.85,98.85];%xxxxxx b=[22.10,22.39,22.3 ...

  10. Android原生和H5交互;Android和H5混合开发;WebView点击H5界面跳转到Android原生界面。

    当时业务的需求是这样的,H5有一个活动商品列表的界面,IOS和Android共用这一个界面,点击商品可以跳转到Android原生的商品详情界面并传递商品ID:  大概就是点击H5界面跳转到Androi ...