LINQ के लिए जावा समतुल्य है? [बन्द है]


820

LINQ के लिए Java समतुल्य है?


4
वे SQL के लिए LINQ प्रतीत होते हैं।
SLaks

8
इस एक की जाँच करें: github.com/nicholas22/jpropel-light, वास्तविक उदाहरण: नया स्ट्रिंग [] {"जेम्स", "जॉन", "जॉन", "एडी"} .where (startWith ("j"))। () .distinct ();
NT_

1
Java ppl में अभी भी कई स्टेटमेंट्स और foreach loops का उपयोग किया जाता है, जिन्हें Linq द्वारा हल किया जा सकता है ...
om471987

1
इसके अलावा स्काला w / पूर्ण LINQ API के लिए: github.com/nicholas22/propelS
Scooterville

4
@ क्रेस्टैड एक .NET पुरुष के रूप में अब ज्यादातर जावा दुनिया में फंस गया है, मुझे आपका दर्द महसूस हो रहा है। हालांकि आपको स्केला की कोशिश करनी चाहिए - प्रथम श्रेणी के कार्य / क्लोजर, समझ के लिए (लिनक्यू के क्वेरी सिंटैक्स के समान नहीं, लेकिन समान स्थितियों में से कई में उपयोगी), एक एकीकृत प्रकार प्रणाली, टाइप इंट्रेंस, जेनेरिक टाइप-इरेज़र के लिए कुछ सुविधाजनक वर्कअराउंड्स ... सभी JVM पर चल रहे हैं, जावा के साथ परस्पर क्रिया कर रहे हैं। प्लस अन्य कार्यात्मक अच्छाई का एक गुच्छा जैसे पैटर्न मिलान, विकल्प प्रकार, आदि
टिम गुडमैन

जवाबों:


808

Java के लिए LINQ जैसा कुछ नहीं है।

...

संपादित करें

अब जावा 8 के साथ हमें स्ट्रीम एपीआई में पेश किया गया है , यह संग्रह के साथ काम करते समय एक समान है, लेकिन यह लिनक के समान नहीं है।

यदि यह एक ORM है जिसे आप देख रहे हैं, जैसे Entity Framework, तो आप हाइबरनेट आज़मा सकते हैं

:-)


9
क्या योजना में कुछ है? भाषा में एकीकृत? एक जेसीपी नंबर है? इत्यादि
चेसो

6
बहुत सच है, हालांकि जो
लाइनक्यू सो

11
क्षमा करें, 'बहुत सही' 280Z28 के लिए था। मुझे नहीं पता कि इसके लिए जेसीपी है या नहीं। LINQ ने C # भाषा में कई बदलावों की आवश्यकता बताई, जिस गति से JCP काम करता है, मैं अपनी सांस नहीं रोक पाती।
AgileJon

12
यह सही नहीं है। देखें: stackoverflow.com/questions/10879761/…
स्कूटर्विले

23
LINQ एक विनिर्देशन है, कार्यान्वयन नहीं ... लैम्बडा अभिव्यक्तियाँ LINQ का एक हिस्सा है। LINQ को Java में पोर्ट करने की कोशिश करने वाली सभी परियोजनाएं एक ठोस परिदृश्य (SQL, ऑब्जेक्ट्स ...) के लिए कार्यान्वयन हैं, लेकिन LINQ के मुख्य लक्ष्य को कोवर नहीं करती: कोड में भाषा क्वेरी को एकीकृत करें। इसके कारण, न तो कोई वास्तविक विकल्प है और न ही अभी के लिए, यह विकल्प के रूप में माना जा सकता है।
sisspla

154

एक वैकल्पिक समाधान है, कूलेंटियन

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

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

7
स्तम्भ नाम के लिए स्ट्रिंग, जिसका अर्थ है कि संकलक और IDE स्वत: पूर्ण टाइपो के खिलाफ मदद नहीं करेगा और रिफैक्टिंग करना कठिन है। कोई योजना है कि बदलने के लिए?
एकेवू

2
हाय, एकेवो। मुझे लगता है कि यह बहुत ही अटपटा होगा और मैंने कभी-कभार ऐसा करने की कोशिश की। लेकिन इस समय, जावा 8 के साथ, शीतलन एक पदावनत काम है। शायद यह सबसे पुरानी परियोजनाओं के लिए उपयोगी है ... आपको क्या लगता है?
19WAS85

1
@WagnerAndrade अंतिम प्रतिबद्ध 5-6 साल पहले है। मुझे लगता है कि कार्यक्षमता को काफी हद तक जावा 8 द्वारा बदल दिया गया था? इसके अलावा, बहुत अच्छा नाम :)
अब्दुल

145

लैम्ब्डा अब जावा 8 में JSR-335 के रूप में उपलब्ध हैं - JavaTM प्रोग्रामिंग लैंग्वेज के लिए लैम्ब्डा एक्सप्रेशंस

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

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

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


लैम्ब्डा भी जावा 7 में होना तय नहीं थे? उसका क्या हुआ?
ब्लूराजा - डैनी पफ्लुगुफ्ट

7
ओरेकल ने सन (गाल में जीभ) खरीदा। जावा 7 को बहुत लंबा (5 वर्ष) हो रहा था, इसलिए लंबोदर लघु-सूची से चूक गए, बल्कि यह जनता के लिए निराशाजनक था। कहा जा रहा है कि ओरेकल ऐसा लग रहा है कि यह गेंद उठा रहा है और मुझे लगता है कि हम अगले साल जावा 8 अक्टूबर के लिए निर्धारित हैं।
ब्रेट रयान

1
ध्यान दें कि लैम्ब्डा राज्य को एक बार फिर से अपडेट किया गया है जो अब धाराओं, आंतरिक पुनरावृत्ति, लघु-परिच्छेद और निर्माण संदर्भों को कवर करता है। मैं आप सभी को नए दस्तावेज़ को पढ़ने की सलाह देता हूँ।
ब्रेट रायन

6
लैम्बडा एक्सप्रेशंस LINQ का एक छोटा सा हिस्सा हैं।
sisspla

4
@NeWNeO, यदि आप C # में क्वेरी भाषा का उल्लेख कर रहे हैं, तो हाँ, ऐसा कुछ भी जावा में नहीं आ रहा है, हालांकि मेरे अनुभव में, अधिकांश अनुभवी C # डेवलपर्स क्वेरी लैंग्वेज पर लैम्ब्डा सिंटैक्स पसंद करते हैं। हालाँकि यदि आप उदाहरण के लिए LINQ-to-Entities की बात कर रहे हैं तो आप पाएंगे कि java में lambdas इसे और अधिक सक्षम करेगा। इसे सक्षम करने के लिए जावा 8 में बहुत कुछ है, जैसे कि रक्षक तरीके
ब्रेट रयान

119

आप लैम्बज लाइब्रेरी का उपयोग करके संग्रह में (और भी बहुत कुछ) आइटम को अधिक पठनीय तरीके से चुन सकते हैं

https://code.google.com/archive/p/lambdaj/

Quaere लाइब्रेरी पर इसके कुछ फायदे हैं क्योंकि यह किसी जादुई स्ट्रिंग का उपयोग नहीं करता है, यह पूरी तरह से सुरक्षित है और मेरी राय में यह अधिक पठनीय डीएसएल प्रदान करता है।


6
यह अच्छा है, लेकिन यह एक क्वेरी बनाने और इसे फिर से sql, xml, संग्रह, आदि को निष्पादित करने के बारे में दूर से रो रहा है
bytebender

जब मैं अपने एंड्रॉइड प्रोजेक्ट में एक कस्टम क्लास पर लैम्ब्डज का चयन करता हूं तो मुझे java.lang.ExceptionInInitializerError क्यों मिल सकता है?
topwik

1
+1 यह वास्तव में उन लोगों के लिए अच्छा है जो SQL / XML की परवाह नहीं करते हैं और केवल संग्रह तक आसान पहुंच चाहते हैं।
ashes999

101

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

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


github.com/TrigerSoft/jaque ने इस तरह से पाया और अभिव्यक्ति पेड़ बनाने की सुविधा दी। जावा 8 लैम्ब्डा के साथ संयुक्त, किसी भी LINQ क्षमता को .Net में उसी प्रयास के साथ लागू किया जा सकता है।
कॉन्स्टेंटिन ट्राइगर

तुलना के लिए यह उत्तर देखें: stackoverflow.com/questions/25989449/…
कोन्स्टेंटिन ट्राइगर

49

LINQ ऑब्जेक्ट्स के लिए - JAVA 8 ने स्ट्रीम एपीआई को जोड़ा है जो मूल्यों की धाराओं पर कार्यात्मक-शैली संचालन के लिए समर्थन जोड़ता है:

पैकेज java.util.stream

जावा 8 व्याख्या: लैम्बदास को जावा कलेक्शंस में लागू करना

LINQ to SQL / NHibernate / etc। (डेटाबेस क्वेरी) - एक विकल्प JINQ का उपयोग करना होगा जो नई JAVA 8 सुविधाओं का भी उपयोग करता है और 26 फरवरी, 2014 को Github पर जारी किया गया था: https://github.com/my2iu/Jinq

जिनक जावा में डेटाबेस क्वेरी लिखने के लिए डेवलपर्स को एक आसान और प्राकृतिक तरीका प्रदान करता है। आप संग्रह में संग्रहीत सामान्य जावा ऑब्जेक्ट की तरह डेटाबेस डेटा का इलाज कर सकते हैं। आप उन पर पुनरावृति कर सकते हैं और सामान्य जावा कमांड का उपयोग करके उन्हें फ़िल्टर कर सकते हैं, और आपके सभी कोड स्वचालित रूप से अनुकूलित डेटाबेस प्रश्नों में अनुवादित हो जाएंगे। अंत में, LINQ- शैली क्वेरी जावा के लिए उपलब्ध हैं!

JINQ परियोजना स्थल: http://www.jinq.org/


सुनिश्चित नहीं हैं कि पाठकों ने आपके उत्तर पर ध्यान क्यों नहीं दिया, भले ही स्ट्रीम एपीआई LINQ के सबसे करीब है!
रफीद

3
LINQ की तुलना में स्ट्रीम API एक बुरा मजाक है।
आंद्रेई रोनेया

1
सॉरी यार, रूठने का मतलब नहीं है। मैं स्ट्रीम API के साथ अपना सिर काटने के बाद एक LINQ बराबर की तलाश में था। मैं सिर्फ यह कहना चाहता था कि यह वास्तविक समकक्ष नहीं है, बस इतना ही।
आंद्रेई रोनेया

1
@ AndreiRQnea क्या आप LINQ प्रदाताओं (LINQ to XML, LINQ to JSON, LINQ to NHibernate, आदि) के लिए समान कार्यक्षमता की तलाश कर रहे हैं?
रेज़वान फ्लवियस पांडा

2
मुझे एक संग्रह पर समूह और अधिकतम करने का एक साधन था .. मैं अंततः सफल हुआ लेकिन बहुत प्रयास और बहुत अधिक कोड के साथ।
आंद्रेई R Andrenea

29

एक परियोजना है जिसे योग्यता कहा जाता है ।

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

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


2
Quaere ऐसा लगता है कि यह LINQ क्या प्रदान करता है की एक बिट प्रदान करता है, लेकिन सवाल एक 'समकक्ष' के लिए है
AgileJon

6
तो यह LINQ की तरह कुछ है , अगर एक सीधा समकक्ष नहीं है? यह कम से कम मददगार लगता है
ब्रायन एग्न्यू

3
@ एगाइलजॉन: यदि वह वास्तव में समकक्ष है, तो उसने पूछा नहीं होगा। वह टाइप कर सकता था from x in xs select xऔर उत्तर (नहीं) का पता लगा सकता था ।
kizzx2

18

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

एक प्रकार का क्वैरे / LINQ शैली के ढांचे के लिए, Querydsl का उपयोग करने पर विचार करें । Querydsl JPA / Hibernate, JDO, SQL और Java संग्रह का समर्थन करता है।

मैं Querydsl का अनुचर हूं, इसलिए यह उत्तर पक्षपाती है।


6
"समान रूपरेखा" लिंक मृत है। क्या आपके पास अभी भी एक समकक्ष पृष्ठ है?
लुकास एडर

हमें QueryDSL पुस्तक कब मिलेगी? या सस्ती ट्रेनिंग के विकल्प भी? आपका समर्थन लिंक 404s है।
kervin

16

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


1
Esp। स्काला की "समझ के लिए"।
निको

10

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


9

अब जब जावा 8 लैम्ब्डा का समर्थन करता है, तो Java API बनाना संभव है जो LINQ के समान हो।

जिन्क जावा के लिए इन नए LINQ- शैली पुस्तकालयों में से एक है।

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


8

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

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


6
आप परियोजना में अपनी भूमिका का उल्लेख करना चाह सकते हैं।
थोरबजोरन रेव एंडरसन

8

Java LINQ to SQL कार्यान्वयन। .NET LINQ की तुलना में पूर्ण भाषा एकीकरण और बड़ा फीचर सेट प्रदान करता है।


2
क्या मैं उसी तरह से XML फ़ाइलों को पढ़ने / लिखने के लिए JaQue का उपयोग कर सकता हूं जिस तरह से हम LINQ के साथ कर सकते हैं?
खुर्रम मजीद

7

मैंने गूगल से अमरूद-लाइब्रेरी की कोशिश की । यह एक है FluentIterableजो मुझे लगता है कि LINQ के करीब है। इसके अलावा कार्यात्मक देखें ।

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 के रूप में सफल नहीं है लेकिन दिलचस्प लग रहा है।


7

https://code.google.com/p/joquery/

विभिन्न संभावनाओं का समर्थन करता है,

संग्रह दिया गया,

Collection<Dto> testList = new ArrayList<>();

प्रकार के,

class Dto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

फ़िल्टर

जावा 7

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property("id").eq().value(1);
Collection<Dto> filtered = query.list();

जावा 8

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property(Dto::getId)
    .eq().value(1);
Collection<Dto> filtered = query.list();

इसके अलावा,

Filter<Dto> query = CQ.<Dto>filter()
        .from(testList)
        .where()
        .property(Dto::getId).between().value(1).value(2)
        .and()
        .property(Dto::grtText).in().value(new string[]{"a","b"});

सॉर्टिंग (जावा 7 के लिए भी उपलब्ध है)

Filter<Dto> query = CQ.<Dto>filter(testList)
        .orderBy()
        .property(Dto::getId)
        .property(Dto::getName)
    Collection<Dto> sorted = query.list();

समूहीकरण (जावा 7 के लिए भी उपलब्ध है)

GroupQuery<Integer,Dto> query = CQ.<Dto,Dto>query(testList)
        .group()
        .groupBy(Dto::getId)
    Collection<Grouping<Integer,Dto>> grouped = query.list();

जॉइन (जावा 7 के लिए भी उपलब्ध)

दिया हुआ,

class LeftDto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

class RightDto
{
    private int id;
    private int leftId;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getLeftId()
        {
            return leftId;
        }

    public int getText()
    {
        return text;
    }
}

class JoinedDto
{
    private int leftId;
    private int rightId;
    private String text;

    public JoinedDto(int leftId,int rightId,String text)
    {
        this.leftId = leftId;
        this.rightId = rightId;
        this.text = text;
    }

    public int getLeftId()
    {
        return leftId;
    }

    public int getRightId()
        {
            return rightId;
        }

    public int getText()
    {
        return text;
    }
}

Collection<LeftDto> leftList = new ArrayList<>();

Collection<RightDto> rightList = new ArrayList<>();

जैसे शामिल हो सकते हैं,

Collection<JoinedDto> results = CQ.<LeftDto, LeftDto>query().from(leftList)
                .<RightDto, JoinedDto>innerJoin(CQ.<RightDto, RightDto>query().from(rightList))
                .on(LeftFyo::getId, RightDto::getLeftId)
                .transformDirect(selection ->  new JoinedDto(selection.getLeft().getText()
                                                     , selection.getLeft().getId()
                                                     , selection.getRight().getId())
                                 )
                .list();

भाव

Filter<Dto> query = CQ.<Dto>filter()
    .from(testList)
    .where()
    .exec(s -> s.getId() + 1).eq().value(2);

5

आप मेरी लाइब्रेरी कलेक्शंस® की कोशिश कर सकते हैं । यह LINQ को ऑब्जेक्ट के संग्रह पर प्रश्नों की तरह चलाने की अनुमति देता है। आपको LINQ की तरह ही predicate पास करना है। यदि आप java6 / 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 में भी उपयोग कर सकते हैं, या रेट्रोब्लाडा के साथ पुराने जावा में और यह ग्रेडल प्लगइन है , तो आपके पास नए फैंसी सिंटैक्स होंगे:

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

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


अच्छा लगा। लाइकपब
read

4

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

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


हाँ, यह एक जेपीए एपीआई है। LINQ से दूर है, लेकिन कुछ नहीं से बेहतर है। और कोई कह सकता है कि यह हाइबरनेट मानदंड एपीआई पर आधारित है। देखें: docs.jboss.org/hibernate/core/3.6/reference/en-US/html/…
Irawan

4

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

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

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


4

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

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

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


4

बुनियादी कार्यात्मक संग्रह के लिए, Java 8 ने इसे बनाया है, अधिकांश प्रमुख गैर-जावा JVM भाषाओं ने इसे (Scala, Clojure, इत्यादि) में बनाया है, और आप पहले के जावा संस्करणों के लिए काम पर जोड़ सकते हैं।

SQL डेटाबेस में पूर्ण भाषा एकीकृत पहुँच के लिए, Scala (JVM पर चलता है) Slick है


3

LINQ (LINQ to Objects) के लिए, Java 8 में कुछ समतुल्य होगा, प्रोजेक्ट लैम्ब्डा देखें ।

यह Enumerable की है वस्तुओं विस्तार के लिए LINQ की तरह सामान । लेकिन अभिव्यक्ति और एक्सप्रेशनट्री जैसी अधिक जटिल LINQ चीजों के लिए (ये LINQ to SQL और अन्य LINQ प्रदाताओं के लिए आवश्यक हैं यदि वे कुछ अनुकूलित और वास्तविक प्रदान करना चाहते हैं), अभी तक कोई समकक्ष नहीं है लेकिन शायद हम भविष्य में देखेंगे कि :)

लेकिन मुझे नहीं लगता कि भविष्य में जावा पर घोषित प्रश्नों की तरह कुछ भी होगा।


2

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

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

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


2

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

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

पहले हमें कुछ डेटा के संग्रह की आवश्यकता होती है, चलो स्ट्रिंग्स का एक सेट कहते हैं

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

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

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);
}

1

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


1

हो सकता है कि आप जिस उत्तर की उम्मीद कर रहे हों, लेकिन यदि आप में से कुछ भाग को संग्रह (खोज, छंटाई, छानने, रूपांतरण, विश्लेषण) पर भारी काम की आवश्यकता हो, तो आप क्लोजर या स्काला में कुछ कक्षाएं लिखने के लिए विचार कर सकते हैं ।

उनके कार्यात्मक स्वभाव के कारण, संग्रह के साथ काम करना वे सबसे अच्छे हैं। मुझे स्काला के साथ बहुत अधिक अनुभव नहीं है, लेकिन क्लोजर के साथ आपको अपनी उंगलियों पर एक अधिक शक्तिशाली लाइनक मिलेगा और एक बार संकलित करने के बाद, आप जिन कक्षाओं का उत्पादन करेंगे, वे कोड आधार के बाकी हिस्सों के साथ सहज रूप से एकीकृत होंगे।


1
Groovy या jRuby भी व्यवहार्य उम्मीदवार होंगे, क्योंकि इन सभी में बहुत अधिक कार्यात्मक प्रकृति होती है।
cdeszaq

1

एक अनाम उपयोगकर्ता ने एक और उल्लेख किया, Diting :

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

समर्थित विधियाँ: कोई, कास्ट, संपर्क, शामिल, गिनती, अलग, एलीमेंट, को छोड़कर, पहले, FirstOrDefault, groupBy, interset, join, last, lastOrDefault, ofType, orderBy, orderByDescending, Rev, select, selectMany, single, singleOrDefault, Skip , स्किपव्हील, टेक, टेकव्हील, टोअर, एरेय्रेलिस्ट, यूनियन, जहां


1

Scala.Now स्टार मैंने इसे पढ़ा, और इसे linq की तरह पाया लेकिन अधिक सरल और अधिक अपठनीय। लेकिन scala linux में चला सकते हैं, हाँ? csharp को मोनो की आवश्यकता होती है।


1
स्काला को चलाने के लिए जावा रनटाइम की आवश्यकता होती है: यह जरूरी नहीं कि आप स्थापित किए गए घटकों के आधार पर या तो एक नंगे लिनक्स इंस्टॉल पर काम करें।
रूप

@RU GNU / Linux के लिए पूरी तरह से आज्ञाकारी JRE है, और मोनो पूरी तरह से .NET .NET कार्यान्वयन नहीं है।
प्रदर्शित नाम

@ बड़ी बात यह है कि मेरी बात नहीं थी, लेकिन मोनो LINQ अच्छी तरह से चलता है न? इसके अलावा, अब लिनक्स के लिए माइक्रोसॉफ्ट का अपना .Net कोर है
Rup

(GNU /) लिनक्स विंडोज के अलावा एकमात्र प्लेटफॉर्म नहीं है, और JRE विभिन्न प्रकार के प्लेटफार्मों के लिए मौजूद है। मोनो पूरी तरह से सब कुछ लागू नहीं करता है, उदाहरण के लिए कोई WPF नहीं है।
प्रदर्शित नाम

0

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


1
यकीन है कि यह पीछा किया गया था, बस "पिज्जा" नाम के तहत नहीं। पिज्जा से जेनरिक को जीजे में मिला दिया गया, जो तब जावा 1.3 संदर्भ संकलक बन गया (हालांकि जेनरिक 1.5 के पीछे एक ध्वज के पीछे छिपे हुए थे)। इस बीच ... बाकी के विचार, और कुछ अतिरिक्त, स्काला बन गए।
केविन राइट

उस जानकारी के लिए धन्यवाद, निश्चित रूप से स्काला यहां एक अच्छा बिंदु है। लेकिन ये क्षमताएं जहाँ जावा भाषा में एकीकृत नहीं हैं। आप अच्छे क्वेरी कोड को लागू करने के लिए स्काला भाषा का उपयोग कर सकते हैं और परिणामी बाइनरी का उपयोग तब जावा से कर सकते हैं।
निको

इसके अलावा ONGL को commons.apache.org/proper/commons-ognl पर देखें , जो उपयोग में है और अभी भी बनाए रखा जा रहा है।
निको


0

आप इस लाइब्रेरी को आज़मा सकते हैं: https://code.google.com/p/qood/

इसका उपयोग करने के कुछ कारण यहां दिए गए हैं:

  1. हल्के: सीखने के लिए केवल 9 सार्वजनिक इंटरफ़ेस / वर्ग।
  2. SQL जैसी क्वेरी: ग्रुप-बाय, ऑर्डर-बाय, लेफ्ट जॉइन, फॉर्मूला, ... आदि को सपोर्ट करता है।
  3. बड़े डेटा के लिए: हीप मेमोरी के बजाय फाइल (QFS) का उपयोग करें।
  4. ऑब्जेक्ट-रिलेशनल प्रतिबाधा बेमेल को हल करने का प्रयास करें ।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.