Enum、Stream
Enum
其常見(jiàn)用法見(jiàn):https://cloud.tencent.com/developer/section/1116852
在sort時(shí),如果要獲得穩(wěn)定的排序結(jié)果,要使用<= 而不是 <。
?
Stream
Stream是延遲處理的,而Enum是貪婪的,則意味著傳給它一個(gè)收集,它會(huì)默默計(jì)算那個(gè)收集的所有內(nèi)容。如:
[ 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 ]#第一個(gè)map函數(shù)接受原始列表并生成一個(gè)新列表,其元素值是原來(lái)的平方。...如此下去最終生成了四個(gè)列表s = Stream.map [ 1, 3, 5, 7 ], &(&1 + 1) #s不是一個(gè)列表 Enum.to_list s #這樣使用 => [ 2, 4, 6 ,8 ]#我們通常這樣寫(xiě) [ 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 #轉(zhuǎn)化為我們可見(jiàn)的使用Stream沒(méi)有中間結(jié)果,但是運(yùn)行速度慢了兩倍。適用于數(shù)據(jù)抵達(dá)的慢,但一直持續(xù)。使用Enum要等到所有數(shù)據(jù)到達(dá)后才能開(kāi)始處理。使用流,只有有數(shù)據(jù)抵達(dá)就可以進(jìn)行處理。
?
自定義流
Stream.cycle。它接受一個(gè)枚舉類型參數(shù),并返回一個(gè)包含該枚舉類型參數(shù)元素的無(wú)限流。當(dāng)?shù)竭_(dá)結(jié)尾時(shí)會(huì)從頭開(kāi)始
Stream.cycle(~w{ green white }) |> Enum.take(5) #green white green white greenStream.repeatedly。接受一個(gè)函數(shù),在需要更新時(shí)調(diào)用該函數(shù)
Stream.iterate。Stream.iterate( start_value, next_fun )生成一個(gè)無(wú)限流,第一個(gè)值是start_value,下一個(gè)值是調(diào)用next_fun函數(shù)以第一個(gè)值為參數(shù)生成的。
Stream.iterate(0, &(&1 + 1)) |> Enum.take(5) #[ 0, 1, 2, 3, 4]Stream.unfold。使用前兩個(gè)參數(shù)計(jì)算下一個(gè)值
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。現(xiàn)在需要在流開(kāi)始的時(shí)候才創(chuàng)建/讀取數(shù)據(jù),而在流結(jié)束的時(shí)候需要關(guān)閉數(shù)據(jù)。Stream.resource第一個(gè)參數(shù)接受一個(gè)函數(shù),它會(huì)返回值。第二個(gè)參數(shù)也是接受一個(gè)函數(shù),函數(shù)接受第一個(gè)函數(shù)的返回值。第三個(gè)參數(shù)函數(shù)關(guān)閉相關(guān)資源。
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 )?
推導(dǎo)式
for x <- [1, 2, 3, 4, 5], do: x * xfor x <- [1, 2, 3, 4, 5], x < 4, do: x * x如果有兩個(gè)生成器,則它們的操作是嵌套的。
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]例(使用了兩個(gè)生成器和過(guò)濾器)。
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 防止出現(xiàn){2, 5}、{5, 2}?
推導(dǎo)式處理二進(jìn)制。推導(dǎo)式中的變量只在其內(nèi)部有效。
for << ch <- "hello >>, do: ch #返回的是列表[104, 101, 108, 108, 111] iex顯示為 'hello' for << ch <- "hello" >>, do: <<ch>> #將編碼轉(zhuǎn)換為字符串 ["h", "e", ... ]推導(dǎo)式的返回值可以被into 改變。
for x <- ~w{ cat dog }, into: Map.new, do: { x, String.upcase(x) } # %{"cat" => "CAT", "dog" => "DOG" }?
轉(zhuǎn)載于:https://www.cnblogs.com/lr1402585172/p/11498748.html
總結(jié)
以上是生活随笔為你收集整理的Enum、Stream的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 字典:散列表、散列字典、关键字列表、集合
- 下一篇: 字符串与二进制