日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Enum、Stream

發(fā)布時(shí)間:2023/11/30 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Enum、Stream 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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 green

  Stream.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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。