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相关推荐

  1. JUC源码级学习(下)-函数式编程、stream流、jvm等

    12.四大函数式接口(必需掌握) 新时代的程序员:lambda表达式.链式编程.函数式接口.Stream流式计算 函数式接口: 只有一个方法的接口 @FunctionalInterface publi ...

  2. JavaSE-常用类、Stream 流式计算

    JavaSE-常用类.Stream 流式计算 常用类 内置包装类 Integer String 类型转换 StringBuilder(JDK1.5) StringBuffer(JDK1.0) Date ...

  3. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  4. 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解

    前言 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScr ...

  5. Swift 中枚举、结构体、类(enum、struct、class)

    Swift 中枚举.结构体.类(enum.struct.class) Swift中的枚举与OC相比不会自动分配初始值,值的类型不会限定为整数,可以给定关联值类型和具体值(整型.浮点型.字符型(Swif ...

  6. MySQL CHAR、VARCHAR、TEXT、ENUM、SET(字符串类型)

    字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据.字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找. MySQL 中的字符串类型有 CHAR.VARCHAR.TIN ...

  7. 5、(字符串类型)CHAR、VARCHAR、TEXT、ENUM、SET

    字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据. 字符串可以区分或者不区分大小写的串比较,还可以进行正则表达式的匹配查找. MySQL 中的字符串类型有 CHAR.VARCHAR.TI ...

  8. 万字详解,JDK1.8的Lambda、Stream和日期的使用详解

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...

  9. Java23-day14【函数式接口(Supplier\Consumer\Predicate\Function)、Stream流(生产方式\中间方法\终结方法)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

最新文章

  1. java基础学习(1)-jre与jdk
  2. 【整理】SAP PM工厂维护模块初识
  3. 计算机有哪些应用领域 请举例说明,计算机图形学作业求助
  4. android的应用入口点函数,android 没有main函数,怎么找到程序执行入口呢?以及activity主要生命周期的方法说明...
  5. Qt Creator设置Nimble
  6. 使用Commons Logging - Java异常处理
  7. 华为谷歌互利合作曝光:或将推Nexus手表
  8. 通过set方式注入的bean为null_Spring 注入集合
  9. Python中出现:RunTimeError:implement_array_function method already has a docstring.异常解决
  10. python常用的装饰器库_Python中的各种装饰器详解
  11. 51单片机之定时器\计数器的工作原理
  12. 二. 2d-2d 对极约束 估计相机位姿pose(R,t)
  13. cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
  14. Fluent NHibernate other example
  15. AT89C51/AT89S51/STC89C51单片机烧录程序的区别
  16. 解决Maven项目pom文件中出现的错误:“Missing artifact oracle:ojdbc7:jar:12.1.0.2.0:compile“
  17. 获取随机经纬度、经纬度范围
  18. 你喜欢最华为手机哪一点?网友评论亮了
  19. 有没有自己制作地图的软件,可以生成地图的软件
  20. paperpass论文查重

热门文章

  1. 新mac 下第一次 安装 mongodb 步骤
  2. Axis通过wsdd部署Web Service
  3. const 和readonly
  4. TreeView无限极分类绑定(从数据库读取数据源)
  5. How to use fb.data.query to get friends info?
  6. 当代国人绝难做到的10件平常事
  7. 职业生涯中12个最致命的想法
  8. python爬虫requests实战_Python爬虫之requests库网络爬取简单实战
  9. ggplot2设置坐标轴范围_R语言数据可视化| ggplot2中会“分身术”的facet_wrap()与facet_grid()...
  10. python编写自定义函数判断n1-n2范围内的素数_【每日道代码题001】- PYTHON基础复习...