Java ที่ดีที่สุดเทียบเท่ากับ Linq คืออะไร [ปิด]


17

มีห้องสมุดใน Java ที่ใกล้เคียงกับการให้บริการการทำงานของ Linq หรือไม่


1
ฉันคิดว่าคุณหมายถึง "ไวยากรณ์ของ LINQ" มากกว่า "การทำงานของ LINQ" มีห้องสมุดหลายแห่งที่มีฟังก์ชั่นการใช้งานเหมือนกัน :-)
mikera

Java เทียบเท่าน่าจะGroovy ด้วยค่าใช้จ่ายของการสูญเสียความปลอดภัยของประเภทแม้ว่า
ริ้น

คำตอบ:


20

ในการรับไวยากรณ์คิวรี LINQ แบบเต็มคุณจะต้องอัปเดตข้อมูลจำเพาะภาษาและคอมไพเลอร์ที่สนับสนุนคำหลักและโครงสร้างไวยากรณ์ใหม่ นี่ไกลเกินกว่าผู้อ่านส่วนใหญ่ที่นี่

เพื่อให้ได้รูปแบบ Lin-method method-chain ใน Java ที่มีลักษณะและทำงานเหมือนใน C # คุณต้องมีสองสิ่งที่ Java ไม่สนับสนุน วิธีการขยาย (วิธีการคงที่ที่สามารถนำไปใช้กับอินสแตนซ์ราวกับว่ามันเป็นวิธีการอินสแตนซ์) และการแสดงออกแลมบ์ดา (ตัวแทนที่ไม่ระบุชื่อ) อย่างไรก็ตามทั้งสองสามารถถูกปลอมแปลงด้วยการสร้าง Java ที่มีอยู่หากคุณยินดีที่จะได้รับการเข้ารหัส verbosity เพิ่มเติมเล็กน้อย สิ่งหนึ่งที่ฉันพบว่าน่าทึ่งเกี่ยวกับ Java คือความสามารถในการสร้างการใช้งานอินเตอร์เฟสแบบไม่ระบุชื่อ นำไปใช้กับอินเทอร์เฟซที่มีฟังก์ชั่นบริสุทธิ์เพียงอย่างเดียวซึ่งโดยทั่วไปจะอนุญาตให้มีตัวแทนที่ไม่ระบุตัวตนแบบง่ายหากคุณมีอินเทอร์เฟซสำหรับลายเซ็นแต่ละวิธีที่คุณต้องการ

ดังนั้นด้าน IEnumerable (Iterable สำหรับ Javaheads) ของ Linq ซึ่งเป็นเชนเมธอดควรเป็นไปได้ที่จะประมาณใน Java; โดยพื้นฐานแล้วคุณจะใช้มันเป็นอินเทอร์เฟซที่คล่องแคล่วซึ่งควบคุม monad คุณต้องมีคลาสอย่าง a LinqIterable, ใช้งาน Iterable,:

  • สามารถแปลงอินพุต Iterable ใด ๆ ให้เป็นอินสแตนซ์ LinqIterable
  • มีวิธีการสำหรับการประมวลผลรายการพื้นฐานเช่นการกรองการจัดกลุ่มการเรียงต่อกันการแยกการสั่งซื้อ ฯลฯ ที่ยอมรับอินเทอร์เฟซแบบฟังก์ชั่นเดียวและสร้าง LinqIterables ใหม่ทำให้การผูกมัดของวิธีการเหล่านี้
  • มีวิธีการแปลง LinqIterable กลับไปเป็นวัตถุ "คอนกรีต" เช่น ToList, ToArray, ToMap เป็นต้น

ดังนั้นคุณอาจกำหนดไลบรารี "คล่องแคล่ว" ที่จะอนุญาตให้มีคำสั่งเช่น:

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 นั้นค่อนข้างทรงพลังหรือไม่


2
วิธีการขยายที่สนุกสนานและการแสดงออกแลมบ์ดามีทั้งใน Java 8 บางที LINQ กำลังจะมาใช่ไหม
lxs

4
ดีถ้าคุณมีวิธีการขยายและ lambdas คุณมีด้าน "นับจำนวน" ของ Linq ของ. NET โดยไม่ต้องใช้ความพยายามอย่างมาก มันจะยังคงเป็นฉันกล่าวว่าต้องมีการเปลี่ยนแปลงข้อกำหนด Java เพื่อให้คำหลักที่ทำให้แบบสอบถาม Linq แต่สุจริตในการใช้ Linq วันต่อวันฉันไม่พบแบบสอบถามมากเกินไปที่ไม่เพียง แสดงเป็นเมธอดเชนและคอมไพเลอร์แปลงไวยากรณ์ของ Linq ให้เป็นเมธอดเชน (ปลั๊กอิน VS มีอยู่ที่สามารถแปลง 1: 1 ระหว่างเคียวรีและเชนส่วนใหญ่) หินก้าวต่อไปที่แท้จริงจะเป็นต้นไม้แสดงออก (Queryable Linq)
KeithS

8

ดู:

  • /programming/1217228/what-is-the-java-equivalent-for-linq - บางคนบอกว่าไม่มีอะไรเทียบเท่าหรือคุณสามารถใช้Lambdajเพื่อเลียนแบบได้
  • /programming/346721/linq-for-java-tool - มีการพูดถึงว่าก่อนหน้า Java 8 คุณยังสามารถใช้คอลเลกชันของ Google เพื่อปลอมมันและ Scala ภาษาสนับสนุนภาษานั้นเป็นคุณลักษณะภาษา ( สกาล่าเป็นอีกภาษาที่นิยมใน JVM)
  • http://www.infoq.com/news/2007/09/quaere-linq - ห้องสมุด Java ที่ในทางทฤษฎีให้การทำงานของ LINQ (ฉันไม่ได้ลองด้วยตัวเอง)

1
คุณจะให้ความสำคัญกับการเพิ่มทรัพยากรเหล่านี้สักเล็กน้อยและทำไมคุณถึงแนะนำสิ่งเหล่านี้เมื่อตอบคำถามที่ถาม "เชื่อมโยงเท่านั้นคำตอบ"ไม่ได้ค่อนข้างต้อนรับที่กองแลกเปลี่ยน
ริ้น

อืมฉันคิดว่ามันเป็นกรณีที่คำถามนี้ตอบไปแล้ว - ควรจะดัดแปลงเป็นซ้ำไหม
Martijn Verburg

1
@MartijnVerburg - เราไม่สามารถทำเครื่องหมายคำถามว่าซ้ำซ้อนทั่วทั้งไซต์ รู้รอบจำเป็นต้องยืนอยู่คนเดียวจริงๆ
ChrisF

แก้ไขหวังว่ามันจะมีประโยชน์มากกว่านี้เล็กน้อย
Martijn Verburg

5

ไม่ Linq ต้องการคุณสมบัติความสามารถมากมายที่ Java ใช้เพียงแค่เท่านั้น


4
Java มีข้อมูลทั่วไป
Jonas

6
@ Jonas: จริง แต่ไม่ว่าจริง ๆ แล้วพวกเขาแข็งแกร่งพอที่จะรองรับ LINQ หรือไม่
DeadMG

2
@DeadMG ยังคง Java มีชื่อสามัญ
Mahmoud Hossam

แก้ไขเพื่อลบการอ้างอิงถึง generics
Tom Squires

3

ใช้Scalaสำหรับเหตุผลที่อธิบายได้ที่นี่ :

ใช้พอร์ต. NET ของ Scala มันช่วยให้คุณเข้าถึงทุกสิ่งทุกอย่างใน. NET ซึ่งรวมถึง LINQ อย่างชัดเจน

หากคุณทำไม่ได้คุณสามารถลองใช้ libs เช่นfunctionjavaหรือlambdajแต่คุณจะไม่เข้าใกล้ LINQ จริงๆ


1
Scala ไม่ได้รวมอะไรอย่าง Linq หากไม่มีห้องสมุด
Jonas

1
@ Jonas: งั้นเหรอ? Java ไม่ได้รวมอะไรอย่าง Linq กับไลบรารี่
back2dos

@ back2dos: ใช่นั่นเป็นเหตุผลว่าทำไมคุณต้องตอบด้วยห้องสมุด
Jonas

1
@Jonas: ไลบรารีมาตรฐานของ Scala เหมือน LINQ หรืออีกทางหนึ่ง: LINQ เป็นเพียงชุดของการเขียนโปรแกรมใช้งานสำนวนสำหรับ C # เพิ่มเติมเกี่ยวกับที่นี่
back2dos

@ back2dos: ขอบคุณสำหรับลิงค์ที่ดีฉันเอาอิสระในการรวมมัน
Landei

2

ฉันจะเพิ่มฝรั่งในรายการของไลบรารีที่อาจช่วยให้คุณบรรลุสิ่งที่ LINQ ทำ

แต่อย่างที่คนอื่น ๆ ชี้ให้เห็นไม่มีความเท่าเทียมในจาวาบริสุทธิ์


คุณจะอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่มันทำและทำไมคุณถึงแนะนำว่าเป็นการตอบคำถามที่ถาม "เชื่อมโยงเท่านั้นคำตอบ"ไม่ได้ค่อนข้างต้อนรับที่กองแลกเปลี่ยน
ริ้น

2

คุณสามารถใช้Kormaซึ่งเป็น DSL สำหรับการสืบค้น SQL ที่เขียนด้วย Clojure

ไวยากรณ์ค่อนข้างเรียบร้อย:

(select user
  (with address)
  (fields :firstName :lastName :address.state)
  (where {:email "korma@sqlkorma.com"}))

คุณสามารถเรียกสิ่งนี้ได้อย่างง่ายดายจาก Java โดยการนำเข้าไลบรารี Clojure ที่เกี่ยวข้องและเพียงแค่ใช้ Clojure / Java interop ปกติ


ดังนั้นนี่จะเลียนแบบ Linq ผ่าน SQL ไม่ใช่ LINQ เหนือวัตถุใช่ไหม
งาน

@ งาน: ใช่มันถูกออกแบบมาสำหรับ SQL แม้ว่าฉันจะไม่เห็นเหตุผลใด ๆ ที่มันไม่สามารถขยาย / ดัดแปลงสำหรับวัตถุได้เช่นกัน
mikera

2

ไม่มีคุณสมบัติดั้งเดิมใน 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();

มีอีกสอง API ที่อ้างอิงในการโพสต์บล็อก: lambdaJ และ jLinq


1
where("getName", ...)ฉันกลัวว่าการสูญเสียทั้งการตรวจสอบประเภทคงที่และการตรวจสอบของการดำรงอยู่ของสมาชิกในชั้นเรียนเป็นบิตที่สูงชันราคาเพื่อเรียกร้องให้โทรเหมือน
9000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.