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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

http://blog.csdn.net/jnu_simba/article/details/9123603 一、posix 信号量 信号量的概念参见这里。前面也讲过system v 信号量&#xff0c;现在来说说posix 信号量。 system v 信号量只能用于进程间同步&#xff0c;而posix 信号量除了可以进程间同步&#xff0c;还可以线程间…

洛谷P1080-国王游戏-贪心+高精度

P1080-国王游戏 啊啊啊&#xff0c;刚才已经写了一次了&#xff0c;但是Edge浏览器不知道为什么卡住了&#xff0c;难受。 好吧&#xff0c;其实是一道可做题&#xff0c;分析得到的贪心策略就是就是将a * b小的放在前面&#xff08;其他的懒得说了&#xff09;&#xff0c;主要…

字符串与二进制

单引号字符串会被表示成整数值列表。 &#xff1f;c返回字符 c 的整数编码。下面这个例子用于解析字符列表表示法&#xff0c;该表示法用于表示一个任意的有符号的十进制数据。 defmodule Parse dodef number([ ?- | tail ]) do_number_digits(tail, 0) * -1enddef number([ ?…

P1092虫食算-深度优先搜索+玄学剪枝

P1092虫食算 这道题的思想并不复杂&#xff0c;可是难点在于各种玄学剪枝。在仔细研究了题解大佬的剪枝原理后终于氵了过去。 先上代码&#xff1a; #include<cstdio> #include<cstring> #include<algorithm> using namespace std;const int MAXN100; int n…

多进程

使用spawn创建一个新进程&#xff0c;其第一个参数是模块名、第二个参数是函数名、第三个参数是参数列表。spawn会返回一个进程标识符&#xff0c;通常叫做PID。 defmodule Spawn1 dodef greet doreceive do{sender, msg} ->send sender, { :ok, "Hello #{msg}" }…

Linux socket编程(二) 服务器与客户端的通信

http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html上一篇写了对套接字操作的封装&#xff0c;这一节使用已封装好的Socket类实现服务器与客户端的通信&#xff08;Socket的定义见上篇Socket.h) 服务器端&#xff1a; ServerSocket.h #ifndef SERVERSOCKET_H #defin…

OTP服务器

defmodule Sequence.Server douse GenServerdef handle_call( :next_number, _from, current_number) do{ :reply, current_number, current_number 1}  #reply告诉OTP将第二个元素返回给客户端end end use的效果将OTP GenServer的行为添加到当前模块。这样它就可以处理所有…

洛谷P1040-加分二叉树-dp+二叉树

P1040-加分二叉树 这道题放在深度优先搜索的训练题中&#xff0c;可是我实在没有看出来应该怎么搜索。看了题解以后才看出来是一个很简单的dp(我果然还是太菜了) 看出dp并且算出来最大的分数不是很复杂&#xff0c;关键是输出给定中序遍历序列的二叉树的先序遍历&#xff0c;要…

UNIX网络编程:I/O复用技术(select、poll、epoll)

http://blog.csdn.net/dandelion_gong/article/details/51673085 Unix下可用的I/O模型一共有五种&#xff1a;阻塞I/O 、非阻塞I/O 、I/O复用 、信号驱动I/O 、异步I/O。此处我们主要介绍第三种I/O符复用。 I/O复用的功能&#xff1a;如果一个或多个I/O条件满足&#xff08;输…

解决iex -S mix报错

执行iex -S mix命令的时候会遇到如下错误&#xff1a; 执行 mix deps.get 然后就可以运行 iex -S mix了 其中&#xff0c;有可能会出现 按照其网站下载相应文件&#xff0c;复制到项目根目录下&#xff0c;然后执行命令&#xff08;mix local.rebar rebar ./rebar&#xff09;即…

贪心算法——选择不相交区间问题

题目描述&#xff1a;设有n个活动的集合&#xff0c;其中每个活动都要求使用同一个资源&#xff0c;而在同一时间内只有一个活动能够使用这一资源&#xff0c;每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi(si<fi)&#xff0c;如果选择了活动i&#xff0c;则…

Anker—工作学习笔记

http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 1、基本知识 epoll是在2.6内核中提出的&#xff0c;是之前的select和poll的增强版本。相对于select和poll来说&#xff0c;epoll更加灵活&#xff0c;没有描述符限制。epoll使用一个文件描述符管理多个描述符&am…

Supervisor监控

可参考&#xff1a;https://www.cnblogs.com/wang_yb/archive/2016/06/08/5564459.html &#xff1a;https://segmentfault.com/a/1190000007379204 转载于:https://www.cnblogs.com/lr1402585172/p/11551488.html

深度搜索剪枝——数的划分

【题目描述】将整数n分成k份&#xff0c;且每份不能为空&#xff0c;问有多少种分法&#xff1f; 【输入格式】两个整数n,m(6<n<200,2<m<6) 【输出格式】输出不同的分法数 【样例输入】7 3 【样例输出】4 对于这种搜索题&#xff0c;关键就在于剪枝&#xff1a;确定…

Linux网络编程——tcp并发服务器(I/O复用之select

http://blog.csdn.net/lianghe_work/article/details/46519633 与多线程、多进程相比&#xff0c;I/O复用最大的优势是系统开销小&#xff0c;系统不需要建立新的进程或者线程&#xff0c;也不必维护这些线程和进程。 代码示例&#xff1a; [csharp] view plaincopy #include &…

ets

:ets.new(table_name, pattern) 第一个参数是表名&#xff0c;第二个参数是表的设置选项。 :set  一个key&#xff0c;一个数据&#xff0c;无序 :ordered_set  一个key&#xff0c;一个数据&#xff0c;有序&#xff1b; 1 1.0 :bag  一个key&#xff0c;多个数据&…

贪心算法-区间选点问题-种树

【题目描述】一条街道的一边有几座房子。因为环保原因居民想要在路边种些树&#xff0c;路边的地区被分割成n块&#xff0c;并被编号为1~n。每块大小为一个单位尺寸且最多可总一棵树。每个居民想在门前种些树并制定了三个数b,e,t&#xff0c;这三个数代表居民想在b和e之间最少种…

ets注意事项

当表类型为 :set 时&#xff0c;使用 :ets.first 和 :ets.last 会获取到同一个 key。将表类型换为 :oedered_set 就可以避免这种情况 转载于:https://www.cnblogs.com/lr1402585172/p/11599219.html

CodeForces - 1141CPolycarp Restores Permutation搜索+剪枝

Polycarp Restores Permutation 【题意分析】题意大概是给定一个串&#xff0c;包含从1到n所有的数字。但是给定的是相邻数字的差&#xff0c;需要复原这个串。 大概分析以后发现给定的是一个差分数组&#xff0c;所以只需要枚举第一个元素就可以确定所有元素的值。 问题是如何…

CodeForces - 1141ESuperhero Battle简单模拟

Superhero Battle 这道题卡了我一个多小时&#xff0c;最后也没有做出来&#xff0c;成功称为吊车尾。。。 思路什么的都没有问题&#xff0c;主要是&#xff0c;爆long long了&#xff0c;这个太可怕了&#xff0c;就因为一个中间变量忘记开longlong导致一直一直wa&#xff0c…