廖雪峰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
廖雪峰Java16函数式编程-2Stream-2创建Stream的更多相关文章
- 廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础
1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本 ...
- 廖雪峰Java16函数式编程-1Lambda表达式-3方法引用
Java8引入了Lambda表达式,可以不必编写FunctionalInterface的实现类,直接写Lambda表达式.除了Lambda表达式,我们还可以直接传入方法引用 方法引用是指:如果某个方法 ...
- 廖雪峰Java16函数式编程-2Stream-7其他操作
1. 排序 Stream<T> sorted(); //按元素默认大小排序(必须实现Comparable接口) Stream<T> sorted(Comparator<? ...
- 廖雪峰Java16函数式编程-2Stream-6reduce
1. 聚合方法 Stream.reduce()是一个Stream的聚合方法:把一个Stream的所有元素聚合成一个结果 例如: Stream.of(1, 2, 3, 4, 5).count(); // ...
- 廖雪峰Java16函数式编程-2Stream-5filter
1.filter简介 Stream.filter()是一个转换方法,把一个Stream转换为另一个Stream. 所谓filter操作,就是对一个Stream的所有元素进行测试,不满足条件的元素就被过 ...
- 廖雪峰Java16函数式编程-2Stream-4map
1. map()简介 Stream.map()是一个Stream的转换方法,把一个stream转换为另一个Stream,这2个Stream是按照映射函数一一对应的. 所谓map操作,就是把一种操作运算 ...
- 廖雪峰Java16函数式编程-2Stream-1Stream简介
1. Stream Java8引入全新的Stream API 位于java.util.stream包 1.1 Stream API不同于java.io的InputStream/OutputStream ...
- [python学习篇][廖雪峰][2]函数式编程
函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就 ...
- 廖雪峰Java6 IO编程-2input和output-4Filter模式
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 ...
随机推荐
- spring-boot 集成ehcache报错:org.springframework.expression.spel.SpelEvaluationException: EL1008E:
错误信息:org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field 'pageab ...
- angularJs input框绑定ng-model后js获取不到问题
搬运自:https://blog.csdn.net/fenglongmiao/article/details/81545993 与其他指令一样,ng-controller指令也会创建一个子级作用域,因 ...
- SpringMVC和spring常见面试题总结
1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,C ...
- Python 3.3 IDLE 删除键出现空格卡顿
Python 3.3 IDLE 删除文字时会出现"□",造成删除键卡顿 原因:使用的是百度输入法,由于输入法的编码方式不同,对IDLE造成了不兼容 换成了搜狗输入法问题解决.... ...
- 关于元素的offsetHeight、line-htight
最近在做一个自适应高度的加载时的瀑布效果,使用加载完毕后为其一个A容器设置style的高度的方式完成(原高度为0且超出部分裁剪),使用offsetHeight获取其子元素高度(所有子元素高度均相等), ...
- 官网下载 Linux 上需要的 MySQL的步骤
1.输入MySQL 官网地址 https://dev.mysql.com/ 选择 download ->Community->MySQL Community Server 点击 MyS ...
- bzoj1053题解
[题意分析] 本题中,x被称为反质数,当且仅当没有任意一个严格小于x的正整数的约数个数大于x的约数个数.求不超过N的最大反质数. [解题思路] 数据范围中最大的N=2*109. 首先可以证明,不超过N ...
- 基于SPI的数据报过滤原理与实现
一.个人防火墙技术概述 随着网络安全问题日益严重,广大用户对网络安全产品也越来越关注.防火墙作为一种网络安全工具,早已受到大家的青睐.在PC机上使用的个人防火墙,很大程度上成为广大网民的安全保护者.W ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.send
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.send 1.返回顶部 1. templateMessage.send 本接口应在服务器端调用,详细说明参见服 ...
- Openstack nova-scheduler 源码分析 — Filters/Weighting
目录 目录 前言 调度器 FilterScheduler调度器的工作流程 Filters 过滤器 Filters 类型 Weighting 权重 源码实现 关键文件及其意义 阶段一nova-sched ...