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

廖雪峰Java16函数式编程-2Stream-2创建Stream的更多相关文章

  1. 廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础

    1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本 ...

  2. 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用

    Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...

  3. 廖雪峰Java16函数式编程-2Stream-7其他操作

    1. 排序 Stream<T> sorted(); //按元素默认大小排序(必须实现Comparable接口) Stream<T> sorted(Comparator<? ...

  4. 廖雪峰Java16函数式编程-2Stream-6reduce

    1. 聚合方法 Stream.reduce()是一个Stream的聚合方法:把一个Stream的所有元素聚合成一个结果 例如: Stream.of(1, 2, 3, 4, 5).count(); // ...

  5. 廖雪峰Java16函数式编程-2Stream-5filter

    1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...

  6. 廖雪峰Java16函数式编程-2Stream-4map

    1. map()简介 Stream.map()是一个Stream的转换方法,把一个stream转换为另一个Stream,这2个Stream是按照映射函数一一对应的. 所谓map操作,就是把一种操作运算 ...

  7. 廖雪峰Java16函数式编程-2Stream-1Stream简介

    1. Stream Java8引入全新的Stream API 位于java.util.stream包 1.1 Stream API不同于java.io的InputStream/OutputStream ...

  8. [python学习篇][廖雪峰][2]函数式编程

    函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就 ...

  9. 廖雪峰Java6 IO编程-2input和output-4Filter模式

    1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...

随机推荐

  1. hdu6396 /// fread()快速读入挂

    题目大意: 给定n k 给定主角具有的k种属性 给定n个怪兽具有的k种属性和打死该怪兽后能得到的k种属性对应增幅 求主角最多能打死多少怪兽和最终主角的k种属性 k最大为5 开5个优先队列贪心 快速读入 ...

  2. BOM的构成

    1.DOM 和 BOM 的区别 DOM:文档对象模型,把[文档]当做一个[对象]来看待,DOM的顶级对象是document 主要学习的是操作页面元素,DOM 是 W3C 的标准规范 BOM:浏览器对象 ...

  3. unicode_start - 将控制台设为Unicode模式.

    总览 unicode_start [ font [ screen-font-map ] ] 描述 unicode_start 命令将显示屏及键盘设为 Unicode 模式, 并且有可能还会装载所用的 ...

  4. Linux 父进程发送信号杀死子进程

    #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <signal. ...

  5. Linux 进程间通信 无名管道(pipe)

    无名管道: 1)只能用于具有亲缘关系的进程之间的通信(无名管道是某一个进程创建的,不像普通文件有路径,在文件系统中是不可见的,其他进程要想打开,只能通过继承的方式去打开) 2)半双工的通信模式,具有固 ...

  6. 链表list

    Don't  lost link! list与vector不同之处在于元素的物理地址可以任意. 为保证对列表元素访问的可行性,逻辑上互为前驱和后继的元素之间,应维护某种索引关系.这种索引关系,可抽象地 ...

  7. Java 导出excel进行换行

    在导出excel 的时候,如果原始文字中含有 \n 字符,生成的excel中 会生成 _0040_ 字样的乱码, 如果把 \n 替换为<br/>,excel不会识别成换行符 excel 认 ...

  8. ElasticSearch再学习

    ElasticSearch参数详解 本次使用的windows的版本,如若Linux移步:https://www.cnblogs.com/msi-chen/p/10335794.html 配置文件参数 ...

  9. NX二次开发-UFUN将目录与文件名组合在一起uc4575

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_cfi.h> UF_initialize() ...

  10. (转) MySQL中索引的限制

    转:http://book.51cto.com/art/200906/132459.htm 8.4.8  MySQL中索引的限制 在使用索引的同时,还应该了解MySQL 中索引存在的限制,以便在索引应 ...