คำถามติดแท็ก lambda

Lambdas เป็นฟังก์ชันที่ไม่ระบุตัวตน (กล่าวคือไม่มีตัวระบุเช่นเมธอดในคลาส) ซึ่งสามารถใช้ได้ในภาษาโปรแกรมที่หลากหลาย

2
นี่เป็นรูปแบบที่ดีหรือไม่: แทนที่ฟังก์ชั่นที่ยาวนานด้วยแลมบ์ดาเป็นชุด?
ฉันเพิ่งทำงานในสถานการณ์ต่อไปนี้ class A{ public: void calculate(T inputs); } ประการแรกAแสดงถึงวัตถุในโลกทางกายภาพซึ่งเป็นข้อโต้แย้งที่แข็งแกร่งที่ไม่แยกชั้นเรียนขึ้น ตอนนี้calculate()กลายเป็นฟังก์ชั่นที่ค่อนข้างยาวและซับซ้อน ฉันเข้าใจโครงสร้างที่เป็นไปได้สามประการ: เขียนเป็นกำแพงข้อความ - ข้อดี - ข้อมูลทั้งหมดอยู่ในที่เดียว เขียนprivateฟังก์ชั่นยูทิลิตี้ในชั้นเรียนและใช้พวกเขาในcalculateร่างกาย - ข้อเสีย - ส่วนที่เหลือของชั้นไม่ทราบ / ดูแล / เข้าใจเกี่ยวกับวิธีการเหล่านั้น เขียนcalculateวิธีดังต่อไปนี้: void A::calculate(T inputs){ auto lambda1 = () [] {}; auto lambda2 = () [] {}; auto lambda3 = () [] {}; lambda1(inputs.first_logical_chunk); lambda2(inputs.second_logical_chunk); lambda3(inputs.third_logical_chunk); …
14 c++11  lambda 

4
มีเหตุผลที่จะชอบไวยากรณ์แลมบ์ดาแม้ว่าจะมีเพียงพารามิเตอร์เดียวหรือไม่?
List.ForEach(Console.WriteLine); List.ForEach(s => Console.WriteLine(s)); สำหรับฉันแล้วความแตกต่างนั้นเป็นเครื่องสำอางล้วนๆ แต่มีเหตุผลใดที่ลึกซึ้งว่าทำไมคน ๆ หนึ่งถึงชอบกัน
14 c#  syntax  lambda 

1
C ++ 11 รองรับฟังก์ชั่นรายการลำดับสูงกว่า
ส่วนใหญ่ทำงานเขียนโปรแกรมภาษา (เช่น Common เสียงกระเพื่อมโครงการ / แร็กเก็ต, Clojure, Haskell, สกาล่า Ocaml, SML) สนับสนุนบางส่วนทำงานร่วมกันขั้นสูงในรายการเช่นmap, filter, takeWhile, dropWhile, foldl, foldr(ดูเช่นCommon เสียงกระเพื่อมโครงการ / แร็กเก็ต, Clojure เอกสารอ้างอิงแบบเคียงข้างกัน , เอกสารHaskell , Scala , OCamlและSML ) C ++ 11 มีวิธีการหรือฟังก์ชั่นมาตรฐานที่เทียบเท่าในรายการหรือไม่? ตัวอย่างเช่นลองพิจารณาตัวอย่าง Haskell ต่อไปนี้: let xs = [1, 2, 3, 4, 5] let ys = map (\x -> …

1
Java 8: วิธีปฏิบัติที่ดีในการส่งผ่านสตรีมใน API สำหรับการดำเนินการที่ไม่ราบรื่นหรือไม่
ในไลบรารี pre-Java 8 lambda-heavy เช่น Guava เอาต์พุตใช้อินเตอร์เฟส Java Collection Framework ทั่วไปดังนั้นจึงง่ายต่อการส่งไปยัง API ภายนอก / ภายในและยังคงควบคุมการคำนวณแบบสันหลังยาวหากวิธีไลบรารีทำเช่นนั้น (ขี้เกียจfilter()และtransform()) อย่างไรก็ตามใน Java 8 Streams การเรียกรับ a Collection/ Mapis terminal (เช่นกระตือรือร้น) และจะจัดสรรโครงสร้างข้อมูลใหม่เพื่อเก็บผลลัพธ์ สำหรับการคำนวณที่ซับซ้อนที่มีหลายขั้นตอนและรูปแบบกลยุทธ์อยู่ตรงกลางสิ่งนี้ทำให้เกิดการจัดสรรที่ไม่จำเป็นจำนวนมากเนื่องจากผลลัพธ์ระดับกลาง ดังนั้นผู้คนคิดว่าเป็นวิธีปฏิบัติที่ดีสำหรับ API ภายใน (เช่นกลยุทธ์รูปแบบกลยุทธ์) ในการรับและส่งคืนStreamหรือฉันควรย้อนกลับไปยังคนขี้เกียจ แต่ไม่คล่องตัว (คิดว่าฉันเดา) API ของ Guava แก้ไข: ความกังวลหลักของฉันStreamคือมันสามารถบริโภคได้เพียงครั้งเดียวและผ่านบางสิ่งบางอย่างเช่นSupplier<Stream<X>>ดูยุ่งยากมาก มันเกือบจะผลักดันให้คุณเพิ่งผ่านCollectionและกลับมาอีกครั้งstream()(และจ่ายค่าใช้จ่ายในการประเมินความกระตือรือร้นที่จุดนั้น)
12 java  lambda 

3
ใน Java 8 จะดีกว่าการใช้นิพจน์การอ้างอิงเมธอดหรือเมธอดที่ส่งคืนการใช้อินเตอร์เฟสการทำงานหรือไม่?
Java 8 เพิ่มแนวคิดของส่วนต่อประสานการทำงานรวมถึงวิธีการใหม่มากมายที่ออกแบบมาเพื่อใช้งานส่วนต่อประสานการทำงาน อินสแตนซ์ของอินเทอร์เฟซเหล่านี้สามารถสร้างได้อย่างกระชับโดยใช้นิพจน์การอ้างอิงเมธอด (เช่นSomeClass::someMethod) และนิพจน์แลมบ์ดา (เช่น(x, y) -> x + y) เพื่อนร่วมงานและฉันมีความคิดเห็นที่แตกต่างกันเมื่อควรใช้แบบฟอร์มเดียวหรือแบบอื่น (ซึ่ง "ดีที่สุด" ในกรณีนี้จะทำให้ "อ่านได้ง่ายที่สุด" และ "สอดคล้องกับมาตรฐานการปฏิบัติทั่วไป" มากที่สุด เทียบเท่า) โดยเฉพาะกรณีนี้เกี่ยวข้องกับกรณีที่ข้อมูลต่อไปนี้เป็นจริงทั้งหมด: ฟังก์ชั่นที่เป็นปัญหาไม่ได้ใช้งานนอกขอบเขตเดียว การตั้งชื่อให้ช่วยให้สามารถอ่านได้ (ตรงข้ามกับตรรกะที่เรียบง่ายพอที่จะดูว่าเกิดอะไรขึ้นอย่างรวดเร็ว) ไม่มีเหตุผลการเขียนโปรแกรมอื่นทำไมรูปแบบหนึ่งจะดีกว่าอีกรูปแบบหนึ่ง ความเห็นของฉันในปัจจุบันเกี่ยวกับเรื่องนี้คือการเพิ่มวิธีการส่วนตัวและการอ้างอิงโดยวิธีการอ้างอิงเป็นวิธีที่ดีกว่า รู้สึกว่านี่เป็นวิธีที่คุณสมบัติถูกออกแบบมาให้ใช้และดูเหมือนง่ายขึ้นในการสื่อสารสิ่งที่เกิดขึ้นผ่านชื่อวิธีการและลายเซ็น (เช่น "บูลีน isResultInFuture (ผลผลลัพธ์)" ชัดเจนว่ากำลังส่งคืนบูลีน) นอกจากนี้ยังทำให้วิธีการส่วนตัวนำมาใช้ซ้ำได้มากขึ้นหากการปรับปรุงในอนาคตให้กับชั้นเรียนต้องการใช้ประโยชน์จากการตรวจสอบเดียวกัน แต่ไม่ต้องการเครื่องมือห่อหุ้มส่วนต่อประสานการทำงาน การตั้งค่าของเพื่อนร่วมงานของฉันคือการมีวิธีการที่ส่งกลับอินสแตนซ์ของอินเทอร์เฟซ (เช่น "Predicate resultInFuture ()") สำหรับฉันแล้วมันรู้สึกว่ามันไม่ได้เป็นวิธีที่จะใช้คุณสมบัติรู้สึก clunkier เล็กน้อยและดูเหมือนว่ามันยากที่จะสื่อสารความตั้งใจผ่านการตั้งชื่อ เพื่อให้ตัวอย่างคอนกรีตนี้นี่คือรหัสเดียวกันเขียนในสไตล์ที่แตกต่าง: public class ResultProcessor { public void …

4
โฟกัสหลักของ Java คืออะไร? เหตุใดจึงใช้เวลานานในการรับคุณลักษณะใหม่
ฉันได้รับการสำรวจคุณสมบัติใหม่ใน JDK8 เช่นการแสดงออกแลมบ์ดาวิธีการขยายและสตรีม API ใหม่ เห็นได้ชัดว่าไม่มีคุณสมบัติเหล่านี้ใหม่ในโลกการเขียนโปรแกรมและทำให้สงสัยว่าทำไมสิ่งเหล่านี้ได้รับใน Java จนถึงปัจจุบัน เรามีการแสดงออกแลมบ์ดาใน Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Ruby (1995), Scala (2003), C # (2007) และ 55 ปีหลังจาก Lisp และ แทบทุกคนใน Java (2013) และฉันได้อ่านเกี่ยวกับสตรีมในSIC (1996) ฉันสงสัยว่าทำไมตอนนี้ หลักฐานแสดงให้เห็นว่าการแข่งขันกับภาษาอื่นไม่ใช่แรงจูงใจ ดูเหมือนว่าคุณสมบัติใหม่ ๆ ที่ยอดเยี่ยมใน Java รุ่นนี้เป็นเพียงผลพลอยได้จากการใช้งานแบบคู่ขนาน เรามี lambdas เพราะทำให้การเขียนอัลกอริทึมแบบขนานง่ายขึ้นและเรามีวิธีการขยายเนื่องจากเราต้องการให้พวกเขาให้การสนับสนุนการเปลี่ยนแปลงที่แสดงออกแลมบ์ดาที่ต้องการ ฯลฯ ฯลฯ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.