java - LINQ के लिए जावा समतुल्य क्या है?




(20)

LINQ के लिए जावा समतुल्य क्या है?


2014 तक, मैं अंततः कह सकता हूं कि LINQ अंततः जावा 8 में है। इसलिए अब LINQ का विकल्प खोजने की आवश्यकता नहीं है।


JaQu जावा के लिए LINQ समकक्ष है। हालांकि यह एच 2 डेटाबेस के लिए विकसित किया गया था, यह किसी भी डेटाबेस के लिए काम करना चाहिए क्योंकि यह जेडीबीसी का उपयोग करता है।


Scala.अब मैं इसे पढ़ा स्टार, और इसे linq की तरह पाया लेकिन अधिक सरल और अधिक अपठनीय। लेकिन स्केल लिनक्स पर चल सकता है, हाँ? csharp मोनो की जरूरत है।


अब जावा 8 लैम्ब्डा का समर्थन करता है, जावा एपीआई बनाना संभव है जो LINQ जैसा दिखता है।

http://www.jinq.org/ जावा के लिए इन नए http://www.jinq.org/ शैली पुस्तकालयों में से एक है।

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


आप मेरी लाइब्रेरी CollectionsQuery को आजमा सकते हैं। यह वस्तुओं के संग्रह पर प्रश्नों की तरह LINQ चलाने की अनुमति देता है। आपको LINQ की तरह, भविष्यवाणी करना होगा। यदि आप इंटरफेस के साथ पुराने वाक्यविन्यास का उपयोग करने के लिए जावा 6/7 का उपयोग कर रहे हैं:

List<String> names = Queryable.from(people)
                                    .filter(new Predicate<Person>() {
                                                public boolean filter(Person p) {
                                                    return p.age>20;
                                                }
                                            })
                                    .map   (new Converter<Person,String>() {
                                                public Integer convert(Person p) {
                                                    return p.name;
                                                }
                                            })
                                    .toList();

आप इसे जावा 8 में या पुराने जावा में RetroLambda और इसके RetroLambda प्लगइन के साथ भी इस्तेमाल कर सकते हैं, तो आपके पास नया फैंसी सिंटैक्स होगा:

List<String> names = Queryable.from(people)
                                    .filter(p->p.age>20)
                                    .map   (p->p.name)
                                    .toList();

यदि आपको डीबी पूछताछ चलाने की आवश्यकता है, तो आप ऊपर बताए अनुसार जेआईएनक्यू पर देख सकते हैं, लेकिन इसे रेट्रोलैम्बा द्वारा बैक-पोर्ट किया जा सकता है, सीरियलकृत लैम्ब्डा के उपयोग के लिए डो।


आप स्कैला का उपयोग कर सकते हैं, यह वाक्यविन्यास में समान है और यह वास्तव में शायद linq से अधिक शक्तिशाली है।


एक बहुत अच्छी लाइब्रेरी है जिसका उपयोग आप इसके लिए कर सकते हैं।

यहां स्थित है: https://github.com/nicholas22/jpropel-light

लैम्बडास जावा 8 तक उपलब्ध नहीं होंगे, इसलिए इसका उपयोग करना थोड़ा अलग है और यह प्राकृतिक नहीं लगता है।


एक वैकल्पिक समाधान, Coollection

Coolection नई lambda होने का नाटक नहीं किया है, हालांकि हम पुराने विरासत जावा परियोजनाओं से घिरे हुए हैं जहां यह lib मदद करेगा। उपयोग और विस्तार करना वास्तव में सरल है, संग्रहों पर पुनरावृत्ति के केवल सबसे अधिक उपयोग किए जाने वाले कार्यों को कवर करना, जैसे:

from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();

जब तक आप अपना खुद का समकक्ष बनाने के लिए javacc का उपयोग नहीं करते हैं, तब तक आपको LINQ के बराबर नहीं मिलेगा।

उस दिन तक जब कोई ऐसा करने का एक व्यवहार्य तरीका पाता है, तो कुछ अच्छे विकल्प हैं, जैसे कि


जावा के बराबर वास्तव में "लिंक से एसक्यूएल" नहीं है। लेकिन इसके करीब कुछ। Querydsl


जावा के लिए कई LINQ समकक्ष हैं, तुलना के लिए here देखें।

एक टाइपएफ़ Quaere / LINQ शैली ढांचे के लिए, Querydsl का उपयोग करने पर विचार करें। Querydsl जेपीए / हाइबरनेट, जेडीओ, एसक्यूएल और जावा संग्रह का समर्थन करता है।

मैं Querydsl के रखरखाव हूँ, तो यह जवाब पक्षपातपूर्ण है।


जावा में ऐसी कोई सुविधा नहीं है। अन्य एपीआई का उपयोग करके आपको यह सुविधा मिल जाएगी। मान लीजिए कि हमारे पास एक पशु वस्तु है जिसमें नाम और आईडी है। हमारे पास पशु वस्तुओं वाले सूची वस्तुएं हैं। अब अगर हम सभी पशु नाम प्राप्त करना चाहते हैं जिसमें सूची वस्तु से 'ओ' शामिल है। हम निम्नलिखित क्वेरी लिख सकते हैं

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

उपरोक्त प्रश्न कथन उन जानवरों की सूची देगा जिनमें उनके नाम पर 'ओ' वर्णमाला शामिल है। अधिक जानकारी कृपया निम्नलिखित ब्लॉग के माध्यम से जाओ। http://javaworldwide.blogspot.in/2012/09/linq-in-java.html


प्रोग्रामिंग भाषा पिज्जा (जावा एक्सटेंशन) थी और आपको इसे देखना चाहिए। - यह घोषणात्मक तरीके से डेटा पूछने के लिए "धाराप्रवाह इंटरफेस" की अवधारणा का उपयोग करता है और यह सिद्धांत रूप से LINQ w / o क्वेरी एक्सप्रेशन (http://en.wikipedia.org/wiki/Pizza_programming_language) के समान है। लेकिन हां इसे पीछा नहीं किया गया था, लेकिन जावा में LINQ के समान कुछ पाने का एक तरीका होता।


बस एक और विकल्प जोड़ने के लिए: जावा 6 में javax.persistence.criteria पैकेज का उपयोग कर टाइप-सुरक्षित डेटाबेस क्वेरीज़ का समाधान है।

हालांकि मुझे यह कहना होगा कि यह वास्तव में LINQ नहीं है, क्योंकि LINQ के साथ आप किसी भी IENumerable से पूछ सकते हैं।


मैंने Google से guava-libraries की कोशिश की। इसमें एक FluentIterable जो मुझे लगता है कि LINQ के करीब है। FunctionalExplained भी देखें।

List<String> parts = new ArrayList<String>();  // add parts to the collection.    
FluentIterable<Integer> partsStartingA = 
    FluentIterable.from(parts).filter(new Predicate<String>() {
        @Override
        public boolean apply(final String input) {
            return input.startsWith("a");
        }
    }).transform(new Function<String, Integer>() {
        @Override
        public Integer apply(final String input) {
            return input.length();
        }
    });

जावा के लिए एक व्यापक पुस्तकालय लगता है। निश्चित रूप से LINQ के रूप में संक्षेप में नहीं बल्कि दिलचस्प लग रहा है।


यह लिंक की तरह लगता है कि हर कोई यहां के बारे में बात कर रहा है बस LinqToObjects है। जो मेरा मानना ​​है कि केवल कार्यक्षमता प्रदान करता है जो जावा में आज ही पूरा हो सकता है, लेकिन वास्तव में बदसूरत वाक्यविन्यास के साथ।

जो मैं लिंक में वास्तविक शक्ति के रूप में देखता हूं। नेट यह है कि लैम्ब्डा अभिव्यक्तियों का उपयोग किसी संदर्भ में किया जा सकता है जो या तो प्रतिनिधि या अभिव्यक्ति की आवश्यकता होती है और फिर उचित रूप में संकलित की जाएगी। यह वही है जो LinqToSql (या LinqToObjects के अलावा कुछ भी) काम करने की अनुमति देता है, और उन्हें LinqToObjects के समान वाक्यविन्यास रखने की अनुमति देता है।

ऐसा लगता है कि ऊपर उल्लिखित सभी परियोजनाएं केवल LinqToObjects की क्षमताओं की पेशकश कर रही हैं। जो मुझे चीज बनाता है कि लिंक के लिए क्षितिज पर LinqToSql-type कार्यक्षमता नहीं है।


SBQL4J देखें। यह जावा के साथ एकीकृत टाइप-सुरक्षित मजबूत क्वेरी भाषा है। जटिल और गुणात्मक प्रश्नों को गुणा करने की अनुमति देता है। बहुत सारे ऑपरेटर हैं, जावा विधियों को कन्स्ट्रक्टर के रूप में प्रश्नों के अंदर बुलाया जा सकता है। प्रश्नों का शुद्ध जावा कोड में अनुवाद किया जाता है (रनटाइम पर कोई प्रतिबिंब नहीं है) इसलिए निष्पादन बहुत तेज़ है।

संपादित करें: ठीक है, अब तक एसबीक्यूएल 4 जे जावा भाषा का एकमात्र विस्तार है जो LINQ के समान क्वेरी क्षमताओं को देता है। Quaere और JaQue जैसे कुछ रोचक प्रोजेक्ट हैं लेकिन वे केवल एपीआई हैं, संकलन समय में मजबूत प्रकार की सुरक्षा के साथ वाक्यविन्यास / अर्थशास्त्र विस्तार नहीं।


जेएमआर -335 के रूप में लैम्बडास अब जावा 8 के भीतर उपलब्ध हैं - जावाटीएम प्रोग्रामिंग भाषा के लिए लैम्ब्डा एक्सप्रेशन

अद्यतन : जेडीके 8 अब जारी किया गया है जिसमें परियोजना लैम्ब्डा शामिल है। वर्तमान में अभी भी MEAP में जावा 8 की एक प्रति को पकड़ने लायक है।

जेडीके 8 के भीतर भेड़ के बच्चे को कैसे लागू किया जाता है, जबकि धाराओं, आंतरिक पुनरावृत्ति, शॉर्ट-सर्किटिंग और कन्स्ट्रक्टर संदर्भों की समझ प्राप्त करने के बारे में अच्छी समझ के लिए लैम्बडा से संबंधित ब्रायन गोएट्ज़ लेखों का एक अध्ययन पढ़ें .. आगे के उदाहरण प्राप्त करने के लिए जेएसआर के ऊपर भी देखें ।

मैंने जेडीके 8 में लैम्बडास का उपयोग करने के कुछ फायदों पर एक ब्लॉग लिखा है जिसे द पावर ऑफ द एरो कहा जाता है, नेटबीन 8 को जेडीके 8 में संरचनाओं को परिवर्तित करने के लिए बहुत अच्छा समर्थन है, जिसे मैंने नेटबीन के साथ जेडीके 8 में माइग्रेट करने के बारे में भी ब्लॉग किया है।


tiny-q । (ध्यान दें कि आप वर्तमान में इसे डाउनलोड नहीं कर सकते हैं।)

उपर्युक्त लिंक को अनुकूलित करने वाला एक उदाहरण यहां दिया गया है:

सबसे पहले हमें कुछ डेटा एकत्र करने की ज़रूरत है, आइए तारों का एक सेट कहें

String[] strings = { "bla", "mla", "bura", "bala", "mura", "buma" };

अब हम केवल "तार" से शुरू होने वाले तारों का चयन करना चाहते हैं:

Query<String> stringsStartingWithB = new Query<String>(strings).where(
    new Query.Func<String, Boolean>(){
        public Boolean run(String in) {
            return in.startsWith("b");
        }
    }
);

कोई वास्तविक डेटा कॉपी नहीं किया गया है या ऐसा कुछ भी, जैसे ही आप पुनरावृत्ति शुरू करते हैं, इसे संसाधित किया जाएगा:

for(String string : stringsStartingWithB ) {
    System.out.println(string);
}

quaere नामक एक परियोजना है।

यह जावा फ्रेमवर्क है जो संग्रहों की क्वेरी करने की क्षमता को जोड़ता है।

नोट: लेखक के अनुसार, परियोजना अब और नहीं रखी गई है।





linq