มีห้องสมุดใน Java ที่ใกล้เคียงกับการให้บริการการทำงานของ Linq หรือไม่
มีห้องสมุดใน Java ที่ใกล้เคียงกับการให้บริการการทำงานของ Linq หรือไม่
คำตอบ:
ในการรับไวยากรณ์คิวรี LINQ แบบเต็มคุณจะต้องอัปเดตข้อมูลจำเพาะภาษาและคอมไพเลอร์ที่สนับสนุนคำหลักและโครงสร้างไวยากรณ์ใหม่ นี่ไกลเกินกว่าผู้อ่านส่วนใหญ่ที่นี่
เพื่อให้ได้รูปแบบ Lin-method method-chain ใน Java ที่มีลักษณะและทำงานเหมือนใน C # คุณต้องมีสองสิ่งที่ Java ไม่สนับสนุน วิธีการขยาย (วิธีการคงที่ที่สามารถนำไปใช้กับอินสแตนซ์ราวกับว่ามันเป็นวิธีการอินสแตนซ์) และการแสดงออกแลมบ์ดา (ตัวแทนที่ไม่ระบุชื่อ) อย่างไรก็ตามทั้งสองสามารถถูกปลอมแปลงด้วยการสร้าง Java ที่มีอยู่หากคุณยินดีที่จะได้รับการเข้ารหัส verbosity เพิ่มเติมเล็กน้อย สิ่งหนึ่งที่ฉันพบว่าน่าทึ่งเกี่ยวกับ Java คือความสามารถในการสร้างการใช้งานอินเตอร์เฟสแบบไม่ระบุชื่อ นำไปใช้กับอินเทอร์เฟซที่มีฟังก์ชั่นบริสุทธิ์เพียงอย่างเดียวซึ่งโดยทั่วไปจะอนุญาตให้มีตัวแทนที่ไม่ระบุตัวตนแบบง่ายหากคุณมีอินเทอร์เฟซสำหรับลายเซ็นแต่ละวิธีที่คุณต้องการ
ดังนั้นด้าน IEnumerable (Iterable สำหรับ Javaheads) ของ Linq ซึ่งเป็นเชนเมธอดควรเป็นไปได้ที่จะประมาณใน Java; โดยพื้นฐานแล้วคุณจะใช้มันเป็นอินเทอร์เฟซที่คล่องแคล่วซึ่งควบคุม monad คุณต้องมีคลาสอย่าง a LinqIterable
, ใช้งาน Iterable,:
ดังนั้นคุณอาจกำหนดไลบรารี "คล่องแคล่ว" ที่จะอนุญาตให้มีคำสั่งเช่น:
Map<String, Integer> results = Linq.FromIterable(sourceList)
.Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
.OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
.Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
.ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});
การสร้างห้องสมุดจริงนั้นเป็นการออกกำลังกายที่เกินขอบเขตของคำตอบในการถามตอบทางอินเทอร์เน็ต ฉันแค่บอกว่ามันเป็นไปได้ไม่ใช่เรื่องง่าย
ต้นไม้ Expression ไม่ใช่วิทยาศาสตร์จรวด แต่มันจะเป็นโครงการสำคัญที่จะใช้สิ่งที่. NET มีในพื้นที่นี้ ไม่เพียง แต่คุณต้องการความสามารถในการสร้างทรีนิพจน์เท่านั้นคุณต้องสามารถ "รวบรวม" ทรีนี้ได้ทันทีด้วยการใช้ bytecode ที่ปล่อยออกมา ฉันไม่รู้ว่าการสะท้อนของ Java นั้นค่อนข้างทรงพลังหรือไม่
ดู:
ไม่ Linq ต้องการคุณสมบัติความสามารถมากมายที่ Java ใช้เพียงแค่เท่านั้น
ใช้Scalaสำหรับเหตุผลที่อธิบายได้ที่นี่ :
ใช้พอร์ต. NET ของ Scala มันช่วยให้คุณเข้าถึงทุกสิ่งทุกอย่างใน. NET ซึ่งรวมถึง LINQ อย่างชัดเจน
หากคุณทำไม่ได้คุณสามารถลองใช้ libs เช่นfunctionjavaหรือlambdajแต่คุณจะไม่เข้าใกล้ LINQ จริงๆ
ฉันจะเพิ่มฝรั่งในรายการของไลบรารีที่อาจช่วยให้คุณบรรลุสิ่งที่ LINQ ทำ
แต่อย่างที่คนอื่น ๆ ชี้ให้เห็นไม่มีความเท่าเทียมในจาวาบริสุทธิ์
คุณสามารถใช้Kormaซึ่งเป็น DSL สำหรับการสืบค้น SQL ที่เขียนด้วย Clojure
ไวยากรณ์ค่อนข้างเรียบร้อย:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
คุณสามารถเรียกสิ่งนี้ได้อย่างง่ายดายจาก Java โดยการนำเข้าไลบรารี Clojure ที่เกี่ยวข้องและเพียงแค่ใช้ Clojure / Java interop ปกติ
ไม่มีคุณสมบัติดั้งเดิมใน java ที่เลียนแบบ linq อย่างไรก็ตามมีหลาย API ที่ให้การทำงานเหมือนกัน
ตัวอย่างเช่นโพสต์บล็อกนี้มี jar ที่กำหนดเองเพื่อทำซ้ำ linq
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
และนี่คือตัวอย่างการใช้งาน API จากโพสต์:
animals
สมมติว่าเรามีวัตถุสัตว์ที่มีชื่อและรหัสซึ่งเป็นตัวแทนที่มีรายชื่อของ หากเราต้องการได้รับชื่อสัตว์ทั้งหมดซึ่งมี 'o' จากรายการanimals
เราสามารถเขียนแบบสอบถามต่อไปนี้
from(animals).where("getName", contains("o")).all();
where("getName", ...)
ฉันกลัวว่าการสูญเสียทั้งการตรวจสอบประเภทคงที่และการตรวจสอบของการดำรงอยู่ของสมาชิกในชั้นเรียนเป็นบิตที่สูงชันราคาเพื่อเรียกร้องให้โทรเหมือน