Linq के बराबर सबसे अच्छा जावा क्या है? [बन्द है]


17

क्या जावा में कोई लाइब्रेरी है जो लिनक की कार्यक्षमता प्रदान करने के करीब है?


1
मुझे लगता है कि आप का अर्थ है "LINQ की कार्यक्षमता" के बजाय "LINQ का वाक्यविन्यास"। कई पुस्तकालय हैं जो समान कार्यक्षमता प्रदान करते हैं :-)
मीकेरा

जावा समकक्ष सबसे अधिक संभावना है कि ग्रूवी । हालांकि
खोई हुई

जवाबों:


20

पूर्ण LINQ क्वेरी सिंटैक्स प्राप्त करने के लिए, आपको भाषा की युक्ति और नए कीवर्ड और सिंटैक्स संरचना का समर्थन करने वाले कंपाइलरों के अपडेट की आवश्यकता होगी। यह यहां के अधिकांश पाठकों से परे है।

जावा में लाइनक जैसी विधि-श्रृंखला सिंटैक्स प्राप्त करने के लिए जो सी # में दिखता है और काम करता है, आपको दो चीजों की आवश्यकता है जो जावा समर्थन नहीं करता है; विस्तार विधियाँ (स्थैतिक विधियाँ जिन्हें किसी उदाहरण पर लागू किया जा सकता है जैसे कि यह एक आवृत्ति विधि है), और लैम्ब्डा एक्सप्रेशन (अनाम प्रतिनिधि)। हालांकि, उन दो को मौजूदा जावा कंस्ट्रक्शंस के साथ खराब किया जा सकता है, अगर आप थोड़ी अतिरिक्त कोडिंग क्रिया को अपनाने के लिए तैयार हैं। जावा के बारे में एक बात जो मुझे विशेष रूप से आश्चर्यजनक लगती है वह है गुमनाम इंटरफ़ेस कार्यान्वयन बनाने की क्षमता; एक एकल शुद्ध फ़ंक्शन के साथ एक इंटरफ़ेस पर लागू होता है, जो मूल रूप से सरल अनाम प्रतिनिधियों के लिए अनुमति देता है, बशर्ते आपके पास प्रत्येक विधि हस्ताक्षर के लिए एक इंटरफ़ेस हो, जिसकी आपको आवश्यकता होगी।

इसलिए, विधि श्रृंखला के रूप में, लिनक के IEnumerable (Javaheads के लिए Iterable) जावा में लगभग अनुमानित होना चाहिए; आप मूल रूप से इसे एक धाराप्रवाह इंटरफ़ेस के रूप में लागू करते हैं जो एक सनक को नियंत्रित करता है। LinqIterableIterable को लागू करने के लिए आपको एक वर्ग की आवश्यकता होगी , जो:

  • किसी भी 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;}});

वास्तविक पुस्तकालय का निर्माण इंटरनेट Q & A पर उत्तर के दायरे से परे एक अभ्यास है। मैंने कहा कि यह संभव था, आसान नहीं।

अभिव्यक्ति के पेड़ रॉकेट विज्ञान नहीं हैं, लेकिन यह इस क्षेत्र में .NET के कार्यान्वयन के लिए एक महत्वपूर्ण परियोजना होगी; न केवल आपको एक अभिव्यक्ति पेड़ बनाने की क्षमता की आवश्यकता है, आपको बायोटेक्स द्वारा उत्सर्जित मक्खी का उपयोग करके इस पेड़ को "संकलित" करने में सक्षम होने की आवश्यकता है; मुझे नहीं पता कि जावा का प्रतिबिंब काफी शक्तिशाली है।


2
Funnily पर्याप्त विस्तार के तरीके और लैम्ब्डा अभिव्यक्ति दोनों जावा 8 में हैं। शायद LINQ रास्ते में है?
lxs

4
यदि आपके पास एक्सटेंशन विधियां और लंबोदे हैं, तो आपके पास एक बहुत बड़े प्रयास के बिना .NET के Linq का "Enumerable" पक्ष है। जैसा कि मैंने कहा था, यह तब भी होगा, जो कि लिनक क्वेरी बनाने वाले कीवर्ड की अनुमति देने के लिए जावा युक्ति में बदलाव की आवश्यकता होती है, लेकिन ईमानदारी से दिन-प्रतिदिन लिनक उपयोग में मुझे बहुत सारे प्रश्न नहीं मिले हैं जो आसानी से नहीं होते हैं एक विधि श्रृंखला के रूप में व्यक्त किया गया है, और संकलक बहुत लाइन लाइनों सिंटैक्स को कनवर्ट करता है विधि वीएस (वीएस प्लगइन्स मौजूद हैं जो अधिकांश प्रश्नों और जंजीरों के बीच 1: 1 को बदल सकते हैं)। अगला असली स्टेपिंग पत्थर अभिव्यक्ति के पेड़ (Queryable Linq) होगा।
कीथ्स

8

देख:

  • /programming/1217228/what-is-the-java-equivalent-for-linq - कुछ लोगों का कहना है कि इसके समकक्ष कोई नहीं है या आप इसका इस्तेमाल करने के लिए लैंबडाज का उपयोग कर सकते हैं ।
  • /programming/346721/linq-for-java-tool - एक उल्लेख है कि जावा 8 से पहले आप Google संग्रहों का उपयोग इसे नकली करने के लिए भी कर सकते हैं और यह कि स्केला भाषा इसे भाषा सुविधा के रूप में समर्थन करती है, ( स्काला जेवीएम पर एक अन्य लोकप्रिय भाषा है)।
  • http://www.infoq.com/news/2007/09/quaere-linq - एक जावा पुस्तकालय जो सिद्धांत रूप में LINQ कार्यक्षमता प्रदान करता है (मैंने खुद यह कोशिश नहीं की है)।

1
क्या आप इन संसाधनों में से प्रत्येक के बारे में थोड़ा विस्तार करने का मन बनाएंगे और पूछे गए प्रश्न के उत्तर के रूप में आप इनकी सिफारिश क्यों करेंगे? स्टैक एक्सचेंज में "लिंक-ओनली आंसर" का बहुत स्वागत नहीं है
gnat

हम्म, मुझे लगता है कि यह एक ऐसा मामला है जो इस क्यू को पहले ही जवाब दे दिया गया था - इसे डुप्लिकेट के रूप में मॉडिफाई किया जाना चाहिए?
मार्टिज़न वेरबर्ग

1
@MartijnVerburg - हम साइटों पर डुप्लिकेट के रूप में प्रश्नों को चिह्नित नहीं कर सकते हैं। जवाब वास्तव में अकेले खड़े होने में सक्षम होने की जरूरत है।
ChrisF

संपादित, उम्मीद है कि अब यह थोड़ा अधिक उपयोगी है।
मार्टिज़न वेरबर्ग

5

नहीं। Linq में बहुत सारे langage फीचर्स की आवश्यकता होती है, जो कि Java में केवल dosent होता है


4
जावा में जेनरिक है।
जोनास

6
@ जोनास: यह सच है, लेकिन क्या वे वास्तव में लाइनक्यू का समर्थन करने के लिए पर्याप्त मजबूत हैं या नहीं।
डेडएमजी

2
@DeadMG अभी भी, जावा में जेनरिक है।
महमूद होसाम

जेनरिक के संदर्भ को हटाने के लिए संपादित
टॉम स्क्वायर्स

3

यहां बताए गए कारणों के लिए, स्काला का उपयोग करें :

Scala के .NET पोर्ट का उपयोग करें। यह आपको .NET में सब कुछ के लिए पूर्ण मूल पहुंच प्रदान करता है, जिसमें स्पष्ट रूप से LINQ शामिल है।

आप नहीं कर सकते हैं, तो आप की तरह libs उपयोग करने के लिए कोशिश कर सकते हैं functionjava या lambdaj , लेकिन आप LINQ करने के लिए वास्तव में बंद नहीं आ जाएगा।


1
Scala पुस्तकालयों के बिना Linq की तरह कुछ भी शामिल नहीं है।
जोनास

1
@ जोनास: तो? Java पुस्तकालयों के साथ Linq जैसी कोई चीज़ शामिल नहीं करता है।
192 में बैकऑडोस

@ back2dos: हाँ, यही कारण है कि आपको एक पुस्तकालय के साथ जवाब देना है।
जोनास

1
@ जोनास: स्काला की स्टैंडर्ड लाइब्रेरी LINQ जैसी है। या दूसरा तरीका गोल: LINQ सिर्फ C # के लिए कार्यात्मक प्रोग्रामिंग मुहावरों का एक सेट है। उस पर और अधिक यहाँ
21231 पर back2dos

@ back2dos: महान लिंक के लिए धन्यवाद, मैंने इसे शामिल करने की स्वतंत्रता ली।
लांडेई

2

मैं उन पुस्तकालयों की सूची में अमरूद को शामिल करूंगा जो आपको LINQ करता है।

लेकिन जैसा कि अन्य ने बताया है, शुद्ध जावा में कोई समान नहीं है।


क्या आप इस बारे में और अधिक व्याख्या करने का मन बना रहे हैं कि यह पूछे गए प्रश्न का उत्तर देने के लिए आपको क्या करने की सलाह देता है? स्टैक एक्सचेंज में "लिंक-ओनली आंसर" का बहुत स्वागत नहीं है
gnat

2

आप क्लोर्ज में लिखे SQL प्रश्नों के लिए एक DSL, कोरमा का उपयोग कर सकते हैं ।

सिंटेक्स बहुत साफ है:

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

आप प्रासंगिक Clojure पुस्तकालयों को आयात करके और सामान्य Clojure / Java इंटरॉप का उपयोग करके जावा से इसे बहुत आसानी से कॉल कर सकते हैं।


तो, यह SQL पर Linq का अनुकरण करेगा, न कि वस्तुओं पर LINQ, सही?
नौकरी

@Job: हाँ, यह SQL के लिए डिज़ाइन किया गया है। हालाँकि मुझे ऐसा कोई कारण नहीं दिखता कि इसे वस्तुओं के लिए भी बढ़ाया / अनुकूलित किया जा सके।
मीका

2

जावा में एक मूल विशेषता नहीं है जो लिनिक की नकल करता है। हालांकि, कई एपीआई हैं जो समान कार्यक्षमता प्रदान करते हैं।

उदाहरण के लिए, इस ब्लॉग पोस्ट में linq को दोहराने के लिए एक कस्टम जार है।
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html

और यह पोस्ट से एपीआई का एक उदाहरण उपयोग है:

मान लीजिए कि हमारे पास एक एनिमल ऑब्जेक्ट है जिसका नाम और आईडी है जिसे एक सूची के साथ दर्शाया गया है animals। यदि हम सूची से सभी पशु नाम प्राप्त करना चाहते हैं, जिसमें 'o' शामिल है animals, तो हम निम्नलिखित क्वेरी लिख सकते हैं

from(animals).where("getName", contains("o")).all();

ब्लॉग पोस्टिंग में संदर्भित दो अन्य API हैं: lambdaJ और jLinq


1
मुझे डर है कि स्थैतिक प्रकार की जाँच और जाँच दोनों को खोना एक वर्ग के सदस्य के अस्तित्व की जाँच करना है, जैसे कॉल के लिए कॉल करने के लिए एक कीमत है where("getName", ...)
9000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.