Enum、Stream
Enum
其常见用法见:https://cloud.tencent.com/developer/section/1116852
在sort时,如果要获得稳定的排序结果,要使用<= 而不是 <。
Stream
Stream是延迟处理的,而Enum是贪婪的,则意味着传给它一个收集,它会默默计算那个收集的所有内容。如:
[ 1, 2, 3, 4, 5] |> Enum.map(&(&1 * &1)) |> Enum.with_index |> Enum.map( fn {value, index} -> value - index end ) |> IO.inspect #=> [ 1, 3 ,7, 13, 21 ]#第一个map函数接受原始列表并生成一个新列表,其元素值是原来的平方。...如此下去最终生成了四个列表s = Stream.map [ 1, 3, 5, 7 ], &(&1 + 1) #s不是一个列表 Enum.to_list s #这样使用 => [ 2, 4, 6 ,8 ]#我们通常这样写 [ 1, 2, 3, 4 ] |> Stream.map(&(&1 * &1)) |> Stream.map(&(&1 + 1)) |> Stream.filter( fn x -> rem(x, 2) == 1 end ) #rem求余 |> Enum.to_list #转化为我们可见的
使用Stream没有中间结果,但是运行速度慢了两倍。适用于数据抵达的慢,但一直持续。使用Enum要等到所有数据到达后才能开始处理。使用流,只有有数据抵达就可以进行处理。
自定义流
Stream.cycle。它接受一个枚举类型参数,并返回一个包含该枚举类型参数元素的无限流。当到达结尾时会从头开始
Stream.cycle(~w{ green white }) |> Enum.take(5) #green white green white green
Stream.repeatedly。接受一个函数,在需要更新时调用该函数
Stream.iterate。Stream.iterate( start_value, next_fun )生成一个无限流,第一个值是start_value,下一个值是调用next_fun函数以第一个值为参数生成的。
Stream.iterate(0, &(&1 + 1)) |> Enum.take(5) #[ 0, 1, 2, 3, 4]
Stream.unfold。使用前两个参数计算下一个值
Stream.unfold({0 ,1}, fn (f1, f2) -> {f1, {f2, f1 + f2}} end ) |> Enum.take(8)#[ 0, 1 ,1, 2, 3, 5, 8, 13 ]
Stream.resource。现在需要在流开始的时候才创建/读取数据,而在流结束的时候需要关闭数据。Stream.resource第一个参数接受一个函数,它会返回值。第二个参数也是接受一个函数,函数接受第一个函数的返回值。第三个参数函数关闭相关资源。
Stream.resource(fn -> File.open("sample") end, fn file -> case IO.read(file, :line) doline when is_binary(line) -> { [line], file }_ -> { :halt, file }endend,fn file -> File.close!(file) end )
推导式
for x <- [1, 2, 3, 4, 5], do: x * xfor x <- [1, 2, 3, 4, 5], x < 4, do: x * x
如果有两个生成器,则它们的操作是嵌套的。
for x <- [1, 2], y <- [5, 6], do: {x, y} #[ {1, 5}, {1, 6}, {2, 5}, {2, 6} ]
后面的生成器可以使用前面的变量。
min_maxes = [{1, 4}, {2, 3}, {10, 15}] for {min, max} <- min_maxes, n <- min..max, do: n#[1, 2, 3, 4, 2, 3 ,10, 11, 12, 13, 14, 15]
例(使用了两个生成器和过滤器)。
first8 = [1, 2, 3, 4, 5, 6, 7, 8] for x <- first8, y <- first8, x >= y, rem(x*y, 10) == 0, do: {x, y} #x >= y 防止出现{2, 5}、{5, 2}
推导式处理二进制。推导式中的变量只在其内部有效。
for << ch <- "hello >>, do: ch #返回的是列表[104, 101, 108, 108, 111] iex显示为 'hello' for << ch <- "hello" >>, do: <<ch>> #将编码转换为字符串 ["h", "e", ... ]
推导式的返回值可以被into 改变。
for x <- ~w{ cat dog }, into: Map.new, do: { x, String.upcase(x) } # %{"cat" => "CAT", "dog" => "DOG" }
转载于:https://www.cnblogs.com/lr1402585172/p/11498748.html
Enum、Stream相关推荐
- JUC源码级学习(下)-函数式编程、stream流、jvm等
12.四大函数式接口(必需掌握) 新时代的程序员:lambda表达式.链式编程.函数式接口.Stream流式计算 函数式接口: 只有一个方法的接口 @FunctionalInterface publi ...
- JavaSE-常用类、Stream 流式计算
JavaSE-常用类.Stream 流式计算 常用类 内置包装类 Integer String 类型转换 StringBuilder(JDK1.5) StringBuffer(JDK1.0) Date ...
- Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解
Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...
- 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解
前言 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScr ...
- Swift 中枚举、结构体、类(enum、struct、class)
Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...
- MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串类型)
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据.字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找. MySQL 中的字符串类型有 CHAR.VARCHAR.TIN ...
- 5、(字符串类型)CHAR、VARCHAR、TEXT、ENUM、SET
字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据. 字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找. MySQL 中的字符串类型有 CHAR.VARCHAR.TI ...
- 万字详解,JDK1.8的Lambda、Stream和日期的使用详解
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...
- Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】
视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...
最新文章
- java基础学习(1)-jre与jdk
- 【整理】SAP PM工厂维护模块初识
- 计算机有哪些应用领域 请举例说明,计算机图形学作业求助
- android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...
- Qt Creator设置Nimble
- 使用Commons Logging - Java异常处理
- 华为谷歌互利合作曝光:或将推Nexus手表
- 通过set方式注入的bean为null_Spring 注入集合
- Python中出现:RunTimeError:implement_array_function method already has a docstring.异常解决
- python常用的装饰器库_Python中的各种装饰器详解
- 51单片机之定时器\计数器的工作原理
- 二. 2d-2d 对极约束 估计相机位姿pose(R,t)
- cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
- Fluent NHibernate other example
- AT89C51/AT89S51/STC89C51单片机烧录程序的区别
- 解决Maven项目pom文件中出现的错误:“Missing artifact oracle:ojdbc7:jar:12.1.0.2.0:compile“
- 获取随机经纬度、经纬度范围
- 你喜欢最华为手机哪一点?网友评论亮了
- 有没有自己制作地图的软件,可以生成地图的软件
- paperpass论文查重
热门文章
- 新mac 下第一次 安装 mongodb 步骤
- Axis通过wsdd部署Web Service
- const 和readonly
- TreeView无限极分类绑定(从数据库读取数据源)
- How to use fb.data.query to get friends info?
- 当代国人绝难做到的10件平常事
- 职业生涯中12个最致命的想法
- python爬虫requests实战_Python爬虫之requests库网络爬取简单实战
- ggplot2设置坐标轴范围_R语言数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()...
- python编写自定义函数判断n1-n2范围内的素数_【每日道代码题001】- PYTHON基础复习...