ÈÏʶ²»Í¬
Java.net ÓïÑÔÖÐÀàËÆµÄº¯Êý½á¹¹
ÉÏÒ»ÆÚ Java ÏÂÒ»´ú ÎÄÕ£¨¡°º¯Êýʽ±àÂë·ç¸ñ¡±£©¶Ô±ÈºÍ±È½ÏÁË Scala¡¢Groovy
ºÍ Clojure Öеĺ¯Êýʽ±àÂë·ç¸ñ¡£ÔÚ±¾ÎÄÖУ¬ÏµÁÐ×÷¼Ò Neal Ford ½«»á¸üÉîÈëµØÆÊÎö Java
ÏÂÒ»´úÓïÑÔÖеĹýÂË¡¢Ó³ÉäºÍËõ¼õ£¨reduce£©¹¦ÄÜ¡£ÎÄÖÐÌṩµÄһϵÁмò¶ÌµÄ±àÂëʾÀý¿É°ïÖúÄúÕûÀíÕâ 3 ÖÖÓïÑÔÔÚÃüÃûÕâÐ©ÖØÒªµÄº¯Êý½á¹¹µÄ·½Ê½ÉϵıȽÏÈÝÒ×»ìÏýµÄÇø±ð¡£
º¯Êýʽ±à³ÌÓïÑÔ°üº¬¶à¸öϵÁеij£¼ûº¯Êý¡£µ«¿ª·¢ÈËÔ±ÓÐʱºÜÄÑÔÚÓïÑÔÖ®¼ä½øÐÐÇл»£¬ÒòΪÊìϤµÄº¯Êý¾ßÓв»ÊìϤµÄÃû³Æ¡£º¯ÊýʽÓïÑÔÇãÏòÓÚ»ùÓÚº¯Êý·¶ÀýÀ´ÃüÃûÕâЩ³£¼ûº¯Êý¡£´Ó½Å±¾±³¾°ÑÜÉú¶øÀ´µÄÓïÑÔÇãÏòÓÚʹÓøü¾ßÃèÊöÐÔµÄÃû³Æ£¨ÓÐʱÊǶà¸öÃû³Æ£¬°üº¬¶à¸öÖ¸Ïòͬһ¸öº¯ÊýµÄ±ðÃû£©¡£
ÔÚ±¾ÆÚÎÄÕÂÖУ¬ÎÒ½«¼ÌÐøÌ½ÌÖ 3 ÖÖÖØÒªº¯Êý£¨¹ýÂË¡¢Ó³ÉäºÍËõ¼õ£©µÄʵÓÃÐÔ£¬Õ¹Ê¾À´×ÔÿÖÖ Java ÏÂÒ»´úÓïÑÔµÄʵÏÖϸ½Ú¡£ÎÄÖеÄÌÖÂÛºÍʾÀýÖ¼ÔÚ¼õÇá
3 ÖÖÓïÑÔ¶ÔÀàËÆº¯Êý½á¹¹Ê¹ÓõIJ»Ò»ÖÂÃû³ÆÊ±¿ÉÄÜÒýÆðµÄ»ìÏý¡£
¹ýÂË
ÔÚ¹ýÂË º¯ÊýÖУ¬Äú¿ÉÖ¸¶¨Ò»¸ö²¼¶ûÖµÌõ¼þ£¨Í¨³£ÎªÒ»¸ö¸ß½×º¯ÊýµÄÐÎʽ£©£¬½«ËüÓ¦Óõ½Ò»¸ö¼¯ºÏ¡£¸Ãº¯Êý·µ»Ø¼¯ºÏµÄ×Ó¼¯£¬ÆäÖеÄÔªËØÓë¸ÃÌõ¼þÆ¥Åä¡£¹ýÂËÓë²éÕÒ
º¯Êý½ôÃÜÏà¹Ø£¬ºóÕß·µ»Ø¼¯ºÏÖеÚÒ»¸öÆ¥ÅäµÄÔªËØ¡£
Scala
Scala ÓµÓжà¸ö¹ýÂ˺¯Êý±äÌå¡£×î¼òµ¥µÄÇéÐλùÓÚ´«µÝµÄÌõ¼þÀ´¹ýÂËij¸öÁÐ±í¡£ÔÚµÚÒ»¸öʾÀýÖУ¬ÎÒ´´½¨Ò»¸öÊý×ÖÁÐ±í¡£È»ºóʹÓÃÁË
filter() º¯Êý£¬²¢´«µÝÁËÒ»¸ö´úÂë¿é£¬Ö¸¶¨ÁËËùÓÐÔªËØ¶¼¿ÉÒÔ±» 3 Õû³ýµÄÌõ¼þ£º
val numbers = List.range(1, 11) numbers filter (x => x % 3 == 0) // List(3, 6, 9) |
ÎÒ¿ÉÒÀ¿¿ÒþʽµÄ²ÎÊýÀ´´´½¨¸Ã´úÂë¿ìµÄ¸ü¼Ó¼ò½àµÄ°æ±¾£º
numbers filter (_ % 3 == 0) // List(3, 6, 9) |
µÚ¶þ¸ö°æ±¾²»ÄÇôÈß³¤£¬ÒòΪÔÚ Scala ÖУ¬Äú¿ÉÒÔ½«²ÎÊýÌæ»»ÎªÏ»®Ïß¡£Á½¸ö°æ±¾¶¼¿ÉÒԵõ½ÏàͬµÄ½á¹û¡£
¹ýÂ˲Ù×÷µÄÐí¶àʾÀý¶¼Ê¹ÓÃÁËÊý×Ö£¬µ« filter() ÊÊÓÃÓÚÈκμ¯ºÏ¡£´ËʾÀý½« filter() Ó¦Óõ½Ò»¸öµ¥´ÊÁбíÀ´È·¶¨
3 ×Öĸµ¥´Ê£º
val words = List("the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog") words filter (_.length == 3) // List(the, fox, the, dog) |
Scala ÖеÄÁíÒ»¸ö¹ýÂ˺¯Êý±äÌåÊÇ partition() º¯Êý£¬Ëü½«Ò»¸ö¼¯ºÏ²ð·ÖΪ¶à¸ö²¿·Ö¡£ÕâÖÖ²ð·Ö»ùÓÚÄú´«µÝµÄ¸ß½×º¯ÊýÀ´È·¶¨·ÖÀëÌõ¼þ¡£ÔÚÕâÀpartition()
º¯Êý½«·µ»ØÁ½¸öÁÐ±í£¬ËüÃÇÒÀ¾ÝÄÄЩÁбí³ÉÔ±¿É±» 3 Õû³ýÀ´½øÐвð·Ö£º
numbers partition (_ % 3 == 0) // (List(3, 6, 9),List(1, 2, 4, 5, 7, 8, 10)) |
filter() º¯Êý·µ»ØÒ»¸öÆ¥ÅäÔªËØ¼¯ºÏ£¬¶ø find() ½ö·µ»ØµÚÒ»¸öÆ¥ÅäÔªËØ£º
numbers find (_ % 3 == 0) // Some(3) |
µ«ÊÇ£¬find() µÄ·µ»ØÖµ²»ÊÇÆ¥ÅäµÄÖµ±¾Éí£¬¶øÊÇÒ»¸ö°ü×°ÔÚ Option ÀàÖеÄÖµ¡£Option ÓÐÁ½¸ö¿ÉÄܵÄÖµ£ºSome
»ò None¡£ÏñÆäËûһЩº¯ÊýʽÓïÑÔÒ»Ñù£¬Scala ʹÓà Option ×÷ΪһÖÖÔ¼¶¨À´±ÜÃâÔÚȱÉÙij¸öֵʱ·µ»Ø
null¡£Some() ʵÀý°üװʵ¼ÊµÄ·µ»ØÖµ£¬ÔÚ numbers find (_ % 3 == 0) µÄÇé¿öÏ£¬¸ÃֵΪ
3¡£Èç¹ûÎÒ³¢ÊÔ²éÕÒij¸ö²»´æÔÚµÄÖµ£¬ÄÇô·µ»ØÖµ½«Îª None£º
numbers find (_ < 0) // None |
Scala »¹°üº¬¶à¸öº¯Êý£¬ËüÃÇ»ùÓÚÒ»¸öÅж¨º¯ÊýÀ´´¦ÀíÒ»¸ö¼¯ºÏ²¢·µ»ØÖµ»ò¶ªÆúËüÃÇ¡£takeWhile()
º¯Êý·µ»Ø¼¯ºÏÖÐÂú×ãÅж¨º¯ÊýµÄ×î´óµÄÖµ¼¯£º
List(1, 2, 3, -4, 5, 6, 7, 8, 9, 10) takeWhile (_ > 0) // List(1, 2, 3) |
dropWhile() º¯ÊýÌø¹ýÂú×ãÅж¨Ìõ¼þµÄ×î´óÔªËØÊýÁ¿£º
words dropWhile (_ startsWith "t") // List(quick, brown, fox, jumped, over, the, lazy, dog) |
Groovy
Groovy ²»ÊÇÒ»¸öº¯ÊýʽÓïÑÔ£¬µ«Ëü°üº¬Ðí¶àº¯Êý·¶Àý£¬Ò»Ð©·¶ÀýµÄÃû³ÆÔ´×Խű¾ÓïÑÔ¡£ÀýÈ磬ÔÚº¯ÊýʽÓïÑÔÖУ¬¸Ãº¯ÊýÔÚ´«Í³Éϱ»³ÆÎª
filter() µÄº¯Êý£¬¾ÍÊÇ Groovy ÖÐµÄ findAll() ·½·¨£º
(1..10).findAll {it % 3 == 0} // [3, 6, 9] |
Ïñ Scala µÄ¹ýÂ˺¯ÊýÒ»Ñù£¬Groovy ¿É´¦ÀíËùÓÐÀàÐÍ£¬°üÀ¨×Ö·û´®£º
def words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"] words.findAll {it.length() == 3} // [The, fox, the, dog] |
Groovy »¹ÓÐÒ»¸öÀàËÆ partition() µÄº¯Êý£¬³ÆÎª split()£º
(1..10).split {it % 3} // [[1, 2, 4, 5, 7, 8, 10], [3, 6, 9]] |
split() ·½·¨µÄ·µ»ØÖµÊÇÒ»¸öǶÌ×Êý×飬¾ÍÏñ Scala ÖÐ´Ó partition() ·µ»ØµÄǶÌ×ÁÐ±í¡£
Groovy µÄ find() ·½·¨·µ»Ø¼¯ºÏÖеÚÒ»¸öÆ¥ÅäµÄÔªËØ£º
(1..10).find {it % 3 == 0} // 3 |
²»Í¬ÓÚ Scala£¬Groovy ×ñÑ Java Ô¼¶¨£¬ÔÚ find() δÄÜÕÒµ½ÔªËØÊ±·µ»Ø null£º
(1..10).find {it < 0} // null |
Groovy »¹ÓµÓÐ takeWhile() ºÍ dropWhile() ·½·¨£¬ËüÃǾßÓÐÓë Scala
µÄ°æ±¾ÀàËÆµÄÓïÒ壺
[1, 2, 3, -4, 5, 6, 7, 8, 9, 10].takeWhile {it > 0} // [1, 2, 3] |
Óë Scala ʾÀýÖÐÒ»Ñù£¬dropWhile ±»ÓÃ×÷Ò»¸öרÃŵĹýÂËÆ÷£ºËü¶ªÆúÓëÅж¨Ìõ¼þÆ¥ÅäµÄ×î´óǰ׺£¬½ö¹ýÂËÁбíµÄµÚÒ»²¿·Ö£º
def moreWords = ["the", "two", "ton"] + words moreWords.dropWhile {it.startsWith("t")} // [quick, brown, fox, jumped, over, the, lazy, dog] |
Clojure
Clojure ÓµÓÐÁîÈËÕ𾪵ļ¯ºÏ²Ù×÷Àý³ÌÊýÁ¿¡£ÓÉÓÚ Clojure µÄ¶¯Ì¬ÀàÐÍ£¬ÆäÖÐÐí¶àÀý³Ì¶¼ÊÇͨÓõġ£Ðí¶à¿ª·¢ÈËÔ±ÇãÏòÓÚʹÓÃ
Clojure£¬ÒòΪËüµÄ¼¯ºÏ¿â·Ç³£·á¸»ºÍÁé»î¡£Clojure ʹÓô«Í³µÄº¯Êýʽ±à³ÌÃû³Æ£¬Èç (filter
) º¯ÊýËùʾ£º
(def numbers (range 1 11)) (filter (fn [x] (= 0 (rem x 3))) numbers) ; (3 6 9) |
ÏñÆäËûÓïÑÔÒ»Ñù£¬Clojure Ϊ¼òµ¥µÄÄäÃûº¯ÊýÌṩÁ˼ò½àµÄÓï·¨£º
(filter #(zero? (rem % 3)) numbers) ; (3 6 9) |
¶øÇÒÓëÆäËûÓïÑÔÖÐÒ»Ñù£¬Clojure µÄº¯ÊýÊÊÓÃÓÚÈκÎÊÊÓõÄÀàÐÍ£¬±ÈÈç×Ö·û´®£º
(def words ["the" "quick" "brown" "fox" "jumped" "over" "the" "lazy" "dog"]) (filter #(= 3 (count %)) words) ; (the fox the dog) |
Clojure µÄ (filter ) ·µ»ØÀàÐÍΪ Seq£¬Ëüͨ¹ýÔ²À¨ºÅÀ´ÃèÊö¡£Seq ÊÇ Clojure
ÖеÄ˳Ðò¼¯ºÏµÄºËÐijéÏó¡£
Ó³Éä
ËùÓÐ Java ÏÂÒ»´úÓïÑÔÖг£¼ûµÄµÚ¶þ¸öÖ÷ÒªµÄº¯Êý±äÐÎÊÇÓ³Éä¡£Ó³É亯Êý½ÓÊÜÒ»¸ö¸ß½×º¯ÊýºÍÒ»¸ö¼¯ºÏ£¬È»ºóÏòÿ¸öÔªËØÓ¦Óô«µÝµÄº¯Êý²¢·µ»ØÒ»¸ö¼¯ºÏ¡£·µ»ØµÄ¼¯ºÏ£¨²»Í¬ÓÚ¹ýÂË£©µÄ´óСÓëÔʼ¼¯ºÏÏàͬ£¬µ«¸üÐÂÁËÖµ¡£
Scala
Scala µÄ map() º¯Êý½ÓÊÜÒ»¸ö´úÂë¿é²¢·µ»Ø×ª»»µÄ¼¯ºÏ£º
List(1, 2, 3, 4, 5) map (_ + 1) // List(2, 3, 4, 5, 6) |
map() º¯ÊýÊÊÓÃÓÚËùÓÐÊÊÓõÄÀàÐÍ£¬µ«Ëü²»Ò»¶¨·µ»Ø¼¯ºÏÔªËØµÄÒÑת»»¼¯ºÏ¡£ÔÚ´ËʾÀýÖУ¬ÎÒÔÚÒ»¸ö×Ö·û´®Öзµ»ØËùÓÐÔªËØµÄ´óСÁÐ±í£º
words map (_.length) // List(3, 5, 5, 3, 6, 4, 3, 4, 3) |
ÔÚº¯Êýʽ±à³ÌÓïÑÔÖг£³£»á²úÉúǶÌ×ÁÐ±í£¬ÒÔÖÁÓÚǶÌ×Áбí¶Ô½â³ýǶÌ×£¨Í¨³£³ÆÎª±âƽ»¯£©µÄ¿âÖ§³ÖºÜ³£¼û¡£ÒÔÏÂÊÇ±âÆ½»¯Ò»¸öǶÌ×ÁбíµÄʾÀý£º
List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9)) flatMap (_.toList) // List(1, 2, 3, 4, 5, 6, 7, 8, 9) |
»ñµÃµÄ List Öнö°üº¬ÔªËØ£¬É¾³ýÁ˶îÍâµÄ»ù´¡¼Ü¹¹¡£flatMap º¯ÊýÒ²ÊÊÓÃÓÚ¿ÉÄÜδÒÔ´«Í³·½Ê½Ç¶Ì×µÄÊý¾Ý½á¹¹¡£ÀýÈ磬Äú¿É½«Ò»¸ö×Ö·û´®ÊÓΪһ¸öǶÌ××Ö·ûϵÁУº
words flatMap (_.toList) // List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x, ... |
Groovy
Groovy »¹°üº¬¶à¸ö³ÆÎª collect() µÄÓ³Éä±äÌ塣ĬÈϵıäÌå½ÓÊÜÒ»¸ö´úÂë¿é£¬ÒԱ㽫¸Ã±äÌåÓ¦Óõ½¼¯ºÏµÄÿ¸öÔªËØ£º
(1..5).collect {it += 1} // [2, 3, 4, 5, 6] |
ÏñÆäËûÓïÑÔÒ»Ñù£¬Groovy ÔÊÐí¶Ô¼òµ¥µÄÄäÃû¸ß½×º¯ÊýʹÓüòд£»it ±£Áô×ÖÓÃÓÚÌæ´úµ¥¶ÀµÄ²ÎÊý¡£
collect() ·½·¨ÊÊÓÃÓÚÄú¿ÉÏòÆäÌṩºÏÀíµÄÅж¨Ìõ¼þµÄÈκμ¯ºÏ£¬±ÈÈçÒ»¸ö×Ö·û´®ÁÐ±í£º
def words = ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"] words.collect {it.length()} // [3, 5, 5, 3, 6, 4, 3, 4, 3] |
Groovy »¹ÓÐÒ»¸öÀàËÆÓÚ flatMap() µÄÕÛµþÄÚ²¿½á¹¹µÄ·½·¨£¬³ÆÎª flatten()£º
[[1, 2, 3], [4, 5, 6], [7, 8, 9]].flatten() // [1, 2, 3, 4, 5, 6, 7, 8, 9] |
flatten() ·½·¨Ò²ÊÊÓÃÓÚ²»Ì«Ã÷ÏԵļ¯ºÏ£¬±ÈÈç×Ö·û´®£º
(words.collect {it.toList()}).flatten() // [t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x, j, ... |
Clojure
Clojure °üº¬Ò»¸ö (map ) º¯Êý£¬Ëü½ÓÊÜÒ»¸ö¸ß½×º¯Êý£¨ÆäÖаüº¬ÔËËã·û£©ºÍÒ»¸ö¼¯ºÏ£º
(map inc numbers) ; (2 3 4 5 6 7 8 9 10 11) |
(map ) µÄµÚÒ»¸ö²ÎÊý¿ÉÒÔÊÇÈκνÓÊܵ¥¸ö²ÎÊýµÄº¯Êý£ºÃüÃûº¯Êý¡¢ÄäÃûº¯Êý»òÒÑ´æÔڵĺ¯Êý£¬±ÈÈçµÝÔöÆä²ÎÊýµÄ
inc¡£´ËʾÀýÖÐÑÝʾÁ˸üµäÐ͵ÄÄäÃûÓï·¨£¬ËüÉú³ÉÒ»¸ö×Ö·û´®Öеĵ¥´Ê³¤¶ÈµÄ¼¯ºÏ£º
(map #(count %) words) ; (3 5 5 3 6 4 3 4 3) |
Clojure µÄ (flatten ) º¯ÊýÀàËÆÓÚ Groovy µÄ£º
(flatten [[1 2 3] [4 5 6] [7 8 9]]) ; (1 2 3 4 5 6 7 8 9) |
ÕÛµþ/Ëõ¼õ
ÔÚ 3 ÖÖ Java ÏÂÒ»´úÓïÑÔÖУ¬µÚÈý¸ö³£¼ûº¯ÊýÔÚÃû³ÆÉÏÓµÓÐ×î¶à±äÌåºÍÐí¶àϸ΢µÄÇø±ð¡£foldLeft
ºÍ reduce ÊÇÒ»¸öÃûΪ catamorphism µÄÁбí²Ù×÷¸ÅÄîÉϵÄÌØ¶¨±äÌ壬¸Ã¸ÅÄîÊÇÁбíÕÛµþµÄÒ»ÖÖ·º»¯¡£ÔÚ´ËʾÀýÖУ¬¡°ÕÛµþ×ó²à¡±
±íʾ£º
ʹÓÃÒ»¸ö¶þ½øÖƺ¯Êý»òÔËËã·û½«ÁбíµÄµÚÒ»¸öÔªËØÓëµÚ¶þ¸öÔªËØÏà½áºÏ£¬´´½¨Ò»¸öеĵÚÒ»¸öÔªËØ¡£
µ¥Ò»ÔªËØ¡£
Çë×¢Ò⣬ÕâÊÇÄúÔÚ¶ÔÒ»×éÊý×ÖÇóºÍʱËù×öµÄ²Ù×÷£º´Ó 0 ¿ªÊ¼£¬¼ÓµÚÒ»¸öÔªËØ£¬½«½á¹ûÓëµÚ¶þ¸öÔªËØÏà¼Ó£¬Ò»Ö±Ö´Ðд˲Ù×÷£¬Ö±µ½ÁбíÔªËØ±»ÓÃÍêΪֹ¡£
Scala
Scala ÓµÓÐ×î·á¸»µÄÕÛµþÔËË㼯ºÏ£¬ÕâÊÇÒòΪËüÔÚÒ»¶¨³Ì¶ÈÉϼò»¯Á˶¯Ì¬ÀàÐ͵Ä
Groovy ºÍ Clojure ÖÐûÓеĶàÖÖÀàÐͳ¡¾°¡£Ëõ¼õº¯Êý³£ÓÃÓÚÖ´ÐÐÇóºÍ£º
List.range(1, 10) reduceLeft((a, b) => a + b) // 45 |
Ìṩ¸ø reduce() µÄº¯Êýͨ³£ÊÇÒ»¸ö½ÓÊÜÁ½¸ö²ÎÊý£¬²¢·µ»Øµ¥¸ö½á¹ûµÄº¯Êý»òÔËËã·û£¬ÒÔ±ã¿ÉÒÔʹÓÃÒ»¸öÁÐ±í¡£Äú¿ÉÒÔʹÓÃ
Scala µÄÓï·¨ÌÇÀ´Ëõ¶Ìº¯Êý¶¨Ò壺
List.range(1, 10).reduceLeft(0)(_ + _) // 45 |
reduceLeft() º¯Êý¼ÙÉèµÚÒ»¸öÔªËØÊÇÔËËãµÄ×ó²à¡£¶ÔÓÚÏà¼ÓµÈÔËËã·û£¬²Ù×÷ÊýµÄλÖÃÎ޹ؽôÒª£¬µ«·ÅÖÃ˳Ðò¶ÔÏà³ýµÈÔËËãÖÁ¹ØÖØÒª¡£Èç¹ûÏ£Íû·´×ªÔËËã·ûÓ¦ÓõÄ˳Ðò£¬¿ÉÒÔʹÓÃ
reduceRight()£º
List.range(1, 10) reduceRight(_ - _) // 5 |
Á˽âºÎʱ¿ÉʹÓÃËõ¼õµÈ¸ß¼¶³éÏóÊÇÕÆÎÕº¯Êý±à³ÌµÄÒ»¸ö¹Ø¼ü¡£´ËʾÀýʹÓà reduceLeft() À´È·¶¨¼¯ºÏÖÐ×î³£µÄµ¥´Ê£º
words.reduceLeft((a, b) => if (a.length > b.length) a else b) // jumped |
Ëõ¼õºÍÕÛµþÔËËãÓµÓÐÖØµþµÄ¹¦ÄÜ£¬ËüÃǾßÓÐϸ΢µÄ²î±ð£¬µ«Õâ²»ÊôÓÚ±¾ÎĵÄÌÖÂÛ·¶Î§¡£µ«ÊÇ£¬Í¨³£¿ÉÒÔ¿´µ½ËüÃǵÄÒ»¸öÃ÷ÏÔÇø±ð¡£ÔÚ
Scala ÖУ¬Ç©Ãû reduceLeft[B >:A](op:(B, A) => B):B
±íÃ÷ΩһÏëÒªµÄ²ÎÊý¾ÍÊÇ×éºÏÔªËØµÄº¯Êý¡£³õʼֵӦ¸ÃÊǼ¯ºÏÖеĵÚÒ»¸öÖµ¡£Ïà¶Ô¶øÑÔ£¬Ç©Ãû foldLeft[B](z:B)(op:(B,
A) => B):B ±íʾ½á¹ûµÄÒ»¸ö³õʼÖÖ×ÓÖµ£¬ËùÒÔÄú¿ÉÒÔ·µ»ØÓëÁбíÔªËØÀàÐͲ»Í¬µÄÀàÐÍ¡£
ÒÔÏÂÊÇÒ»¸öʹÓà foldLeft ¶Ô¼¯ºÏÇóºÍµÄʾÀý£º
List.range(1, 10).foldLeft(0)(_ + _) // 45 |
Scala Ö§³ÖÔËËã·ûÖØµþ£¬ËùÒÔÁ½¸ö³£¼ûµÄÕÛµþ²Ù×÷ foldLeft ºÍ foldRight ·Ö±ðÓµÓÐÏàÓ¦µÄÔËËã·û£º/:
ºÍ :\¡£Òò´Ë£¬Äú¿ÉÒÔʹÓà foldLeft ´´½¨ sum µÄ¼ò½à°æ±¾£º
(0 /: List.range(1, 10)) (_ + _) // 45 |
ÀàËÆµØ£¬ÒªÕÒµ½Ò»¸öÁбíÖÐÿ¸öÔªËØµÄ¼¶ÁªÇø±ð£¨ÇóºÍÔËËãµÄ·´Ïò²Ù×÷£¬ÎÞ¿É·ñÈÏÕâÖÖÐèÇóºÜÉÙ¼û£©£¬Äú¿ÉÒÔʹÓÃ
foldRight() º¯Êý»ò :\ ÔËËã·û£º
(List.range(1, 10) :\ 0) (_ - _) // 5 |
Groovy
Groovy ͨ¹ýʹÓÃÖØµþÀ´Ö§³ÖÓë Scala µÄ reduce() ºÍ
foldLeft() Ñ¡ÏîÏàͬµÄ¹¦ÄÜ£¬´Ó¶ø½øÈëËõ¼õÀà±ð¡£¸Ãº¯ÊýµÄÒ»¸ö°æ±¾½ÓÊÜÒ»¸ö³õʼֵ¡£´ËʾÀýʹÓà inject()
·½·¨Éú³ÉÒ»¸ö¼¯ºÏµÄ×ܺͣº
(1..10).inject {a, b -> a + b} // 55 |
Ìæ´úÐÎʽ½ÓÊÜÒ»¸ö³õʼֵ£º
(1..10).inject(0, {a, b -> a + b}) // 55 |
Groovy ÓµÓÐÒ»¸ö±È Scala »ò Clojure СµÃ¶àµÄº¯Êý¿â ¡ª Groovy ÊÇÒ»ÖÖ²»Ç¿µ÷º¯Êýʽ±à³ÌµÄ¶à·¶Àý±à³Ì£¬¿´µ½ÕâÖÖÇé¿öºÁ²»Ææ¹Ö¡£
Clojure
Clojure Ö÷ÒªÊÇÒ»ÖÖº¯Êýʽ±à³ÌÓïÑÔ£¬ËùÒÔËüÖ§³Ö (reduce )¡£(reduce
) º¯Êý½ÓÊÜÒ»¸ö¿ÉÑ¡µÄ³õʼֵ£¬ÒÔ±ãͬʱº¸Ç Scala Ëù´¦ÀíµÄ reduce() ºÍ foldLeft()
ÇéÐΡ£(reduce ) º¯ÊýûÓиøÓû§´øÀ´ÈκξªÏ²¡£Ëü½ÓÊÜÒ»¸öÐèÒªÁ½¸ö²ÎÊýµÄº¯ÊýºÍÒ»¸ö¼¯ºÏ£º
(reduce + (range 1 11)) ; 55 |
Clojure ½«¶ÔÀàËÆ reduce µÄ¹¦Äܵĸ߼¶Ö§³Ö°üº¬ÔÚÒ»¸öÃûΪ reducers µÄ¿âÖУ¬ºóÃæµÄÒ»ÆÚÎÄÕ½«»á½éÉÜÕâ¸ö¿â¡£
½áÊøÓï
ѧϰ²»Í¬·¶Àý£¨±ÈÈ纯Êýʽ±à³Ì£©µÄ²¿·ÖÌôÕ½ÔÚÓÚѧϰÐÂÊõÓï¡£ÔÚ²»Í¬ÉçÇøÊ¹Óò»Í¬µÄ´Ê»ãʱ£¬ÕâÒ»¹ý³Ì»á±äµÃ¸ü¼Ó¸´ÔÓ¡£µ«Ò»µ©ÕÆÎÕÁËÏàËÆÐÔ£¬Äú¾Í»á¿´µ½£¬ËùÓÐ
3 ÖÖ Java ÏÂÒ»´úÓïÑÔ¶¼ÒÔÁîÈ˾ªÆæµÄ·½Ê½ÔÚÓï·¨ÉÏÌṩÁËÖØµþµÄ¹¦ÄÜ¡£
ÔÚÏÂÒ»ÆÚÖУ¬ÎÒ½«Ì½ÌÖ Java ÏÂÒ»´úÓïÑÔÖеÄÄڴ滯£¬ÌÖÂÛº¯ÊýÌØÐÔÈçºÎ½áºÏʹÓÃÀ´ÊµÏÖ¼ò½àÓÐÁ¦¡£
|