เหตุผลในการลบประเภทฟังก์ชั่นใน Java 8


12

ฉันพยายามเข้าใจว่าเพราะเหตุใด JDK 8 Lambda Expert Group (EG) จึงตัดสินใจไม่รวมฟังก์ชันประเภทใหม่ลงในภาษาการเขียนโปรแกรม Java

ไปกว่ารายการทางผมพบว่าหัวข้อที่มีการอภิปรายเกี่ยวกับการกำจัดของประเภทฟังก์ชั่น

ข้อความหลายข้อคลุมเครือสำหรับฉันอาจเป็นเพราะการขาดบริบทและในบางกรณีเนื่องจากความรู้ที่ จำกัด ของฉันเกี่ยวกับการใช้งานระบบพิมพ์

อย่างไรก็ตามมีคำถามสองสามข้อที่ฉันเชื่อว่าฉันสามารถกำหนดได้อย่างปลอดภัยในไซต์นี้เพื่อช่วยให้ฉันเข้าใจได้ดีขึ้นว่าพวกเขาหมายถึงอะไร

ฉันรู้ว่าฉันสามารถถามคำถามในรายการส่งเมลได้ แต่เธรดเก่าและการตัดสินใจทั้งหมดได้ทำไปแล้วดังนั้นโอกาสที่ฉันจะถูกเพิกเฉยเหนือสิ่งอื่นใดที่เห็นว่าคนเหล่านี้มีแผนล่าช้าอยู่แล้ว

ในคำตอบของเขาที่ให้การสนับสนุนการลบประเภทฟังก์ชั่นและรับรองการใช้งาน SAM ประเภท Brian Goetz พูดว่า:

ไม่มีการดัดแปลง มีเธรดที่ยาวเกี่ยวกับประโยชน์ของการปรับประเภทของฟังก์ชัน ประเภทฟังก์ชั่นจะ hobbled

ฉันไม่พบกระทู้ที่เขาพูดถึง ตอนนี้ฉันสามารถเข้าใจได้ว่าการแนะนำฟังก์ชั่นโครงสร้างอาจหมายถึงภาวะแทรกซ้อนบางอย่างในระบบจาวาส่วนใหญ่ที่ระบุสิ่งที่ฉันไม่เข้าใจคือประเภท SAM parametrized แตกต่างกันในแง่ของการทำให้ใหม่

พวกเขาทั้งคู่ต่างก็ประสบปัญหาการทำให้เหมือนกันหรือไม่? ใครบ้างเข้าใจว่าประเภทฟังก์ชั่นแตกต่างจากประเภท SAM parametrized ในแง่ของการทำให้ใหม่?

ในความคิดเห็นอื่น Goetz พูดว่า:

มีสองวิธีพื้นฐานในการพิมพ์: ชื่อและโครงสร้าง ตัวตนของชื่อจะขึ้นอยู่กับชื่อของมัน ตัวตนของโครงสร้างประเภทนั้นขึ้นอยู่กับสิ่งที่มันประกอบไปด้วย (เช่น "tuple of int, int" หรือ "ฟังก์ชั่นจาก int ถึง float") ภาษาส่วนใหญ่เลือกใช้ชื่อหรือโครงสร้างส่วนใหญ่เป็นส่วนใหญ่ ไม่มีภาษาจำนวนมากที่ประสบความสำเร็จในการผสมการพิมพ์ที่ระบุและโครงสร้างยกเว้น "รอบ ๆ ขอบ" Java เป็นชื่อเกือบทั้งหมด (มีข้อยกเว้นเล็กน้อย: อาร์เรย์เป็นชนิดโครงสร้าง แต่ที่ด้านล่างจะมีประเภทองค์ประกอบเล็กน้อยเสมอ; generics มีการผสมของชื่อและโครงสร้างเช่นกันและนี่เป็นส่วนหนึ่งของแหล่งที่มาของหลาย ๆ ของการร้องเรียนของประชาชนเกี่ยวกับข้อมูลทั่วไป) การปลูกถ่ายระบบประเภทโครงสร้าง (ประเภทฟังก์ชั่น) ลงบน Java ' ระบบประเภทระบุหมายถึงความซับซ้อนและกรณีขอบใหม่ ประโยชน์ของฟังก์ชั่นประเภทนี้คุ้มค่าหรือไม่?

ผู้ที่มีประสบการณ์ในการใช้งานระบบพิมพ์ คุณรู้ตัวอย่างของความซับซ้อนหรือกรณีขอบที่เขากล่าวถึงที่นี่หรือไม่?

จริง ๆ แล้วฉันสับสนกับข้อกล่าวหาเหล่านี้เมื่อฉันพิจารณาว่าภาษาโปรแกรมเช่น Scala ซึ่งใช้ JVM ทั้งหมดมีการสนับสนุนประเภทโครงสร้างเช่นฟังก์ชั่นและสิ่งอันดับแม้ว่าจะมีปัญหาการแก้ไขของแพลตฟอร์มพื้นฐาน

อย่าเข้าใจฉันผิดฉันไม่ได้บอกว่าประเภทฟังก์ชั่นควรจะดีกว่าประเภท SAM ฉันแค่อยากเข้าใจว่าทำไมพวกเขาถึงตัดสินใจ


4
"การปลูกถ่ายระบบโครงสร้างแบบโครงสร้าง (ประเภทฟังก์ชั่น) ลงบนระบบประเภทจาวาของจาวาหมายถึงความซับซ้อนใหม่" - สิ่งนี้มีความหมายมากที่สุดสำหรับผู้ใช้ที่ต้องเรียนรู้การใช้ภาษามากขึ้น Javaอย่างง่ายและใช้งานง่ายจะกลายเป็นสิ่งที่ซับซ้อนและยากต่อการเรียนรู้ C ++สิ่งต่าง ๆ เช่นนั้น รายชื่อสมาชิกเมลอาจจะพูดพาดพิงถึงการวิจารณ์ของ "คลื่นลูกใหญ่ของการปรับปรุง" ก่อนหน้านี้ตัวอย่างหนึ่งที่โดดเด่นเป็นJava 5 sucksบทความโดย Clinton Begin ของ MyBatis
gnat

3
"Java ที่เรียบง่ายและใช้งานง่ายกลายเป็นซับซ้อนและยากต่อการเรียนรู้ C ++": โชคไม่ดีปัญหาหนึ่งของภาษาโปรแกรมกระแสหลักคือพวกเขาต้องรักษาความเข้ากันได้แบบย้อนหลังดังนั้นพวกเขาจึงมีแนวโน้มที่จะซับซ้อนเกินไป IMHO (มีประสบการณ์หลายปีกับทั้ง C ++ และ Java) มีบางอย่างที่เป็นจริงสำหรับคำสั่งนี้ ฉันมักจะรู้สึกว่า Java ควรจะแข็งและภาษาใหม่ควรพัฒนาแทน แต่ Oracle ไม่สามารถรับความเสี่ยงดังกล่าวได้
Giorgio

4
@edalorzo: ในฐานะ Clojure, Groovy, Scala และภาษาอื่น ๆ ที่แสดงให้เห็นว่ามันเป็นไปได้ที่ (1) กำหนดภาษาใหม่ (2) ใช้ความมั่งคั่งทั้งหมดของห้องสมุดและเครื่องมือที่เขียนแล้วใน Java โดยไม่ทำลายความเข้ากันได้ย้อนหลัง (3) Java โปรแกรมเมอร์อิสระที่จะเลือกว่าพวกเขาต้องการที่จะอยู่กับ Java สลับไปยังภาษาอื่นหรือใช้ทั้งสอง IMO การขยายภาษาที่มีอยู่อย่างไม่มีกำหนดเป็นกลยุทธ์ในการรักษาลูกค้าในลักษณะเดียวกับที่ บริษัท โทรศัพท์มือถือจำเป็นต้องสร้างรุ่นใหม่ตลอดเวลา
Giorgio

2
ดังที่ฉันเข้าใจจากSAMbdas ใน Javaหนึ่งในเหตุผลก็คือมันเป็นปัญหาที่จะทำให้บางไลบรารี (คอลเลกชัน) เข้ากันได้ย้อนหลัง
Petr Pudlák

2
ที่เกี่ยวข้องโพสต์บน SOซึ่งเชื่อมโยงกับเรื่องนี้โพสต์อื่น ๆ โดยเก๊
assylias

คำตอบ:


6

วิธี SAM นั้นค่อนข้างคล้ายกับสิ่งที่ Scala (และ C ++ 11) ทำกับฟังก์ชั่นนิรนาม (สร้างขึ้นด้วย=>ตัวดำเนินการของ Scala หรือ[]()ไวยากรณ์ของC ++ 11 (lambda))

คำถามแรกที่จะตอบทางฝั่ง Java คือการมีชนิด return ของคำสั่ง lambda เป็นประเภท primitve ใหม่เช่นintหรือbyteหรือประเภทวัตถุบางประเภท ในกาลามีอยู่ไม่มีชนิดดั้งเดิม - แม้จำนวนเต็มเป็นวัตถุของคลาสInt- ฟังก์ชั่นและจะไม่แตกต่างเป็นวัตถุของคลาสFunction1, Function2และอื่น ๆ ขึ้นอยู่กับจำนวนของการขัดแย้งฟังก์ชั่นใช้เวลา

C ++ 11, ruby ​​และ python ในทำนองเดียวกันมีการแสดงออกแลมบ์ดาซึ่งส่งคืนวัตถุที่สามารถเรียกได้ในทางที่ชัดเจนหรือโดยนัย วัตถุที่คืนมามีวิธีการมาตรฐานบางอย่าง (เช่น#callซึ่งสามารถใช้เรียกมันว่าเป็นฟังก์ชันได้ C ++ 11 ใช้std::functionชนิดที่เกินพิกัดoperator()เพื่อให้การเรียกวิธีการโทรของวัตถุนั้นดูเหมือนกับการเรียกใช้ฟังก์ชันแบบข้อความ :-)

ในกรณีที่ข้อเสนอใหม่สำหรับ Java ได้รับยุ่งในการใช้งานในการพิมพ์ที่มีโครงสร้างเพื่อให้การกำหนดวิธีการดังกล่าวไปยังวัตถุอื่นเช่นComparatorซึ่งมีวิธีการหลักเดียวที่มีชื่อที่แตกต่างกัน ขณะนี้เป็นแนวคิดเหนอะในบางวิธีก็จะหมายถึงการที่วัตถุที่เกิดขึ้นสามารถส่งผ่านไปยังฟังก์ชั่นที่มีอยู่ซึ่งใช้วัตถุที่จะเป็นตัวแทนของการโทรกลับ, เปรียบเทียบและอื่น ๆ และคาดว่าจะสามารถที่จะเรียกทั้งกำหนดเดียว วิธีการดังกล่าวเป็นหรือ#compare #callbackเคล็ดลับของ C ++ ในการเอาชนะoperator()ปัญหานี้ได้อย่างเรียบร้อยแม้กระทั่งก่อน C ++ 11 เนื่องจากตัวเลือกการติดต่อกลับทั้งหมดนั้นสามารถเรียกได้ในลักษณะเดียวกันดังนั้น STL จึงไม่จำเป็นต้องปรับเปลี่ยนเพื่ออนุญาตให้ใช้ Lambdas C ++ 11sortและอื่น ๆ Java ที่ไม่เคยใช้การตั้งชื่อมาตรฐานสำหรับวัตถุดังกล่าวในอดีต (อาจเป็นเพราะไม่มีกลอุบายที่เหมือนการใช้งานมากจนเกินไปทำให้เห็นได้ชัด) ไม่โชคดีนักดังนั้นแฮ็คนี้จึงป้องกันไม่ให้พวกเขาเปลี่ยน API ที่มีอยู่จำนวนมาก .


1
กระแทกแดกดันปัญหาถ้ามีหลายประเภทที่แตกต่างกันไม่ลงรอยกันทั้งหมดเป็นตัวแทนของ "ฟังก์ชั่น - เหมือนสิ่งต่าง ๆ " จะสามารถหลีกเลี่ยงได้อย่างเรียบร้อยโดยการเพิ่มประเภทฟังก์ชั่นมาตรฐานในห้องสมุดต้นโดยอิสระ หากมีเคยเป็นjava.util.Function2<T1, T2, R>ใน Java 1.0 แล้วจะไม่มีการอินเตอร์เฟซแทนทุกวิธีการเหล่านั้นจะใช้เวลาComparator Function2<T1, T2, int>(ก็จะมีอินเทอร์เฟซทั้งหมดเช่นFunction2TT_int<T1, T2>เนื่องจากพื้นฐาน แต่คุณได้จุดของฉัน)
Jörg W Mittag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.