LINQ के लिए Java समतुल्य है?
LINQ के लिए Java समतुल्य है?
जवाबों:
Java के लिए LINQ जैसा कुछ नहीं है।
...
संपादित करें
अब जावा 8 के साथ हमें स्ट्रीम एपीआई में पेश किया गया है , यह संग्रह के साथ काम करते समय एक समान है, लेकिन यह लिनक के समान नहीं है।
यदि यह एक ORM है जिसे आप देख रहे हैं, जैसे Entity Framework, तो आप हाइबरनेट आज़मा सकते हैं
:-)
एक वैकल्पिक समाधान है, कूलेंटियन ।
Coolection ने नए लैंबडा होने का ढोंग नहीं किया है, हालांकि हम पुरानी विरासत जावा परियोजनाओं से घिरे हुए हैं, जहां यह दायित्व मदद करेगा। यह संग्रह की तुलना में पुनरावृति के केवल सबसे अधिक उपयोग किए जाने वाले कार्यों को कवर करना और उपयोग करना वास्तव में सरल है:
from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();
लैम्ब्डा अब जावा 8 में JSR-335 के रूप में उपलब्ध हैं - JavaTM प्रोग्रामिंग लैंग्वेज के लिए लैम्ब्डा एक्सप्रेशंस
अद्यतन : JDK8 अब जारी किया गया है जिसमें प्रोजेक्ट लंबा है । यह अभी भी कार्रवाई में अभी भी MEAP में जावा 8 की एक प्रति हथियाने के लायक है ।
ब्रायन गोएत्ज़ के लेखों को एक अच्छी समझ के लिए लैम्ब्डा से संबंधित पढ़ें कि जेडडीके 8 के भीतर लैम्ब्डा कैसे लागू किया जाता है, साथ ही धाराओं, आंतरिक पुनरावृत्ति, शॉर्ट-सर्कुलेटिंग और कंस्ट्रक्टर संदर्भों की समझ प्राप्त करने के लिए .. आगे के उदाहरण प्राप्त करने के लिए जेएसआर के उपरोक्त की जांच करें। ।
मैंने JDK8 में लैम्ब्डा के इस्तेमाल के कुछ फायदों पर एक ब्लॉग लिखा है, जिसे द पॉवर ऑफ द एरो कहा जाता है , NetBeans 8 को JDK8 में कंस्ट्रक्शन को बदलने के लिए बहुत समर्थन है, जिसे मैंने नेटबियंस के साथ JDK 8 में माइग्रेट करने के बारे में भी ब्लॉग किया है ।
आप लैम्बज लाइब्रेरी का उपयोग करके संग्रह में (और भी बहुत कुछ) आइटम को अधिक पठनीय तरीके से चुन सकते हैं
https://code.google.com/archive/p/lambdaj/
Quaere लाइब्रेरी पर इसके कुछ फायदे हैं क्योंकि यह किसी जादुई स्ट्रिंग का उपयोग नहीं करता है, यह पूरी तरह से सुरक्षित है और मेरी राय में यह अधिक पठनीय डीएसएल प्रदान करता है।
जब तक आप अपने खुद के समकक्ष बनाने के लिए javacc का उपयोग नहीं करते आप LINQ के बराबर नहीं पाएंगे ।
उस दिन तक जब कोई ऐसा करने के लिए एक व्यवहार्य तरीका ढूंढता है, कुछ अच्छे विकल्प हैं, जैसे कि
LINQ ऑब्जेक्ट्स के लिए - JAVA 8 ने स्ट्रीम एपीआई को जोड़ा है जो मूल्यों की धाराओं पर कार्यात्मक-शैली संचालन के लिए समर्थन जोड़ता है:
जावा 8 व्याख्या: लैम्बदास को जावा कलेक्शंस में लागू करना
LINQ to SQL / NHibernate / etc। (डेटाबेस क्वेरी) - एक विकल्प JINQ का उपयोग करना होगा जो नई JAVA 8 सुविधाओं का भी उपयोग करता है और 26 फरवरी, 2014 को Github पर जारी किया गया था: https://github.com/my2iu/Jinq
जिनक जावा में डेटाबेस क्वेरी लिखने के लिए डेवलपर्स को एक आसान और प्राकृतिक तरीका प्रदान करता है। आप संग्रह में संग्रहीत सामान्य जावा ऑब्जेक्ट की तरह डेटाबेस डेटा का इलाज कर सकते हैं। आप उन पर पुनरावृति कर सकते हैं और सामान्य जावा कमांड का उपयोग करके उन्हें फ़िल्टर कर सकते हैं, और आपके सभी कोड स्वचालित रूप से अनुकूलित डेटाबेस प्रश्नों में अनुवादित हो जाएंगे। अंत में, LINQ- शैली क्वेरी जावा के लिए उपलब्ध हैं!
JINQ परियोजना स्थल: http://www.jinq.org/
एक परियोजना है जिसे योग्यता कहा जाता है ।
यह एक जावा फ्रेमवर्क है जो क्वेरी संग्रह की क्षमता को जोड़ता है।
नोट: लेखक के अनुसार, इस परियोजना का रखरखाव अभी नहीं किया गया है।
from x in xs select x
और उत्तर (नहीं) का पता लगा सकता था ।
जावा के लिए कई LINQ समकक्ष हैं , एक तुलना के लिए यहां देखें ।
एक प्रकार का क्वैरे / LINQ शैली के ढांचे के लिए, Querydsl का उपयोग करने पर विचार करें । Querydsl JPA / Hibernate, JDO, SQL और Java संग्रह का समर्थन करता है।
मैं Querydsl का अनुचर हूं, इसलिए यह उत्तर पक्षपाती है।
2014 तक, मैं अंत में कह सकता हूं कि LINQ आखिरकार java 8 में है। अब LINQ का कोई विकल्प खोजने की आवश्यकता नहीं है।
अब जब जावा 8 लैम्ब्डा का समर्थन करता है, तो Java API बनाना संभव है जो LINQ के समान हो।
जिन्क जावा के लिए इन नए LINQ- शैली पुस्तकालयों में से एक है।
मैं इस लाइब्रेरी का डेवलपर हूं। यह डेटाबेस के प्रश्नों के लिए जावा का अनुवाद करने के लिए बाइटकोड विश्लेषण का उपयोग करने के पांच साल के शोध पर आधारित है। इसी तरह से C # की D-LINQ एक क्वेरी लेयर है जो Entity Framework के ऊपर बैठती है, Jq, JPA या jOOQ के शीर्ष पर बैठे क्वेरी लेयर के रूप में कार्य करने में सक्षम है। इसमें एकत्रीकरण, समूहों और उपश्रेणियों का समर्थन है। यहां तक कि एरिक मेजर (LINQ के निर्माता) ने जिन्क को स्वीकार किया है ।
SBQL4J देखें । यह प्रकार-सुरक्षित मजबूत क्वेरी भाषा है जो जावा के साथ एकीकृत है। जटिल और नेस्टेड प्रश्नों को लिखने की अनुमति देता है। बहुत सारे ऑपरेटर हैं, जावा विधियों को बिल्डरों के रूप में प्रश्नों के अंदर लाया जा सकता है। क्वेरीज़ शुद्ध जावा कोड में अनुवादित हैं (रनटाइम में कोई प्रतिबिंब नहीं है) इसलिए निष्पादन बहुत तेज है।
संपादित करें: खैर, अब तक SBQL4J यह केवल जावा भाषा का विस्तार है जो LINQ के समान क्वेरी क्षमता देता है। कुछ दिलचस्प परियोजनाएं हैं जैसे कि क्वेरे और जेक्यू लेकिन वे केवल एपीआई की हैं, संकलन समय में मजबूत प्रकार की सुरक्षा के साथ वाक्यविन्यास / शब्दार्थ विस्तार नहीं।
Java LINQ to SQL कार्यान्वयन। .NET LINQ की तुलना में पूर्ण भाषा एकीकरण और बड़ा फीचर सेट प्रदान करता है।
मैंने गूगल से अमरूद-लाइब्रेरी की कोशिश की । यह एक है 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 के रूप में सफल नहीं है लेकिन दिलचस्प लग रहा है।
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);
आप मेरी लाइब्रेरी कलेक्शंस® की कोशिश कर सकते हैं । यह 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 क्वेरी को चलाने की आवश्यकता है, लेकिन यह रेट्रोब्लंबा द्वारा वापस-पोर्ट नहीं किया जा सकता है, जो कि क्रमबद्ध लैम्ब्डा के उपयोग के लिए है।
बस एक और विकल्प जोड़ने के लिए: जावा 6 में javax.persistence.crindia पैकेज का उपयोग करके प्रकार-सुरक्षित डेटाबेस प्रश्नों का समाधान है ।
हालाँकि मुझे कहना होगा कि यह वास्तव में LINQ नहीं है, क्योंकि LINQ के साथ आप किसी भी IEnumerable को क्वेरी कर सकते हैं।
एक बहुत अच्छी लाइब्रेरी है जिसे आप इसके लिए उपयोग कर सकते हैं।
यहां स्थित है: https://github.com/nicholas22/jpropel-light
लैम्ब्डा जावा 8 तक उपलब्ध नहीं होगा, हालांकि इसका उपयोग करना थोड़ा अलग है और प्राकृतिक नहीं लगता है।
ऐसा लगता है कि हर कोई यहाँ के बारे में बात कर रहा है कि LinqToObjects है। मेरा मानना है कि केवल कार्यक्षमता प्रदान करता है जो पहले से ही आज जावा में पूरा किया जा सकता है, लेकिन वास्तव में बदसूरत सिंटैक्स के साथ।
मैं .Net में वास्तविक शक्ति के रूप में जो देखता हूं, वह यह है कि लैम्बडा एक्सप्रेशन को एक डेलिगेट या एक एक्सप्रेशन की आवश्यकता के संदर्भ में इस्तेमाल किया जा सकता है और फिर उपयुक्त रूप में संकलित किया जाएगा। यह वही है जो LinqToSql (या LinqToObjects के अलावा कुछ भी) जैसी चीजों को काम करने की अनुमति देता है, और उन्हें LinqToObjects के समान सिंटैक्स की अनुमति देता है।
ऐसा लगता है कि ऊपर उल्लिखित सभी परियोजनाएं केवल LinqToObjects की क्षमताओं की पेशकश कर रही हैं। जो मुझे यह बताता है कि LinqToSql- प्रकार की कार्यक्षमता जावा के लिए क्षितिज पर नहीं है।
बुनियादी कार्यात्मक संग्रह के लिए, Java 8 ने इसे बनाया है, अधिकांश प्रमुख गैर-जावा JVM भाषाओं ने इसे (Scala, Clojure, इत्यादि) में बनाया है, और आप पहले के जावा संस्करणों के लिए काम पर जोड़ सकते हैं।
SQL डेटाबेस में पूर्ण भाषा एकीकृत पहुँच के लिए, Scala (JVM पर चलता है) Slick है
LINQ (LINQ to Objects) के लिए, Java 8 में कुछ समतुल्य होगा, प्रोजेक्ट लैम्ब्डा देखें ।
यह Enumerable की है वस्तुओं विस्तार के लिए LINQ की तरह सामान । लेकिन अभिव्यक्ति और एक्सप्रेशनट्री जैसी अधिक जटिल LINQ चीजों के लिए (ये LINQ to SQL और अन्य LINQ प्रदाताओं के लिए आवश्यक हैं यदि वे कुछ अनुकूलित और वास्तविक प्रदान करना चाहते हैं), अभी तक कोई समकक्ष नहीं है लेकिन शायद हम भविष्य में देखेंगे कि :)
लेकिन मुझे नहीं लगता कि भविष्य में जावा पर घोषित प्रश्नों की तरह कुछ भी होगा।
जावा में ऐसी कोई सुविधा नहीं है। दूसरे API का उपयोग करके आपको यह सुविधा मिलेगी। मान लीजिए कि हमारे पास एक पशु वस्तु है, जिसका नाम और आईडी है। हमारे पास जानवरों की वस्तुओं वाली सूची वस्तु है। अब यदि हम उन सभी जानवरों के नाम प्राप्त करना चाहते हैं जिनमें सूची ऑब्जेक्ट से 'ओ' है। हम निम्नलिखित प्रश्न लिख सकते हैं
from(animals).where("getName", contains("o")).all();
उपरोक्त कथन के अनुसार उन जानवरों की सूची होगी जिनके नाम में 'ओ' वर्णमाला है। अधिक जानकारी कृपया निम्नलिखित ब्लॉग के माध्यम से जाना। http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
छोटे-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);
}
JaQu जावा के लिए LINQ समतुल्य है। यद्यपि यह H2 डेटाबेस के लिए विकसित किया गया था, इसे किसी भी डेटाबेस के लिए काम करना चाहिए क्योंकि यह JDBC का उपयोग करता है।
हो सकता है कि आप जिस उत्तर की उम्मीद कर रहे हों, लेकिन यदि आप में से कुछ भाग को संग्रह (खोज, छंटाई, छानने, रूपांतरण, विश्लेषण) पर भारी काम की आवश्यकता हो, तो आप क्लोजर या स्काला में कुछ कक्षाएं लिखने के लिए विचार कर सकते हैं ।
उनके कार्यात्मक स्वभाव के कारण, संग्रह के साथ काम करना वे सबसे अच्छे हैं। मुझे स्काला के साथ बहुत अधिक अनुभव नहीं है, लेकिन क्लोजर के साथ आपको अपनी उंगलियों पर एक अधिक शक्तिशाली लाइनक मिलेगा और एक बार संकलित करने के बाद, आप जिन कक्षाओं का उत्पादन करेंगे, वे कोड आधार के बाकी हिस्सों के साथ सहज रूप से एकीकृत होंगे।
एक अनाम उपयोगकर्ता ने एक और उल्लेख किया, Diting :
डाइटिंग एक क्लास लाइब्रेरी है जो चेनेबल तरीकों और अनाम इंटरफ़ेस जैसे कि .NET में लाइनक के माध्यम से संग्रह पर क्वेरी क्षमता प्रदान करती है। अन्य संग्रह लाइब्रेरी के विपरीत, जो स्टैटिक विधियों का उपयोग कर रहे हैं, उन्हें संपूर्ण संग्रह की आवश्यकता होती है, डाइटिंग एक मुख्य सुविधा प्रदान करती है जिसमें एक अलग श्रेणी की चुड़ैल होती है जिसमें संग्रह या सरणी पर क्वेरी को लागू करने के लिए श्रृंखलाबद्ध तरीके होते हैं।
समर्थित विधियाँ: कोई, कास्ट, संपर्क, शामिल, गिनती, अलग, एलीमेंट, को छोड़कर, पहले, FirstOrDefault, groupBy, interset, join, last, lastOrDefault, ofType, orderBy, orderByDescending, Rev, select, selectMany, single, singleOrDefault, Skip , स्किपव्हील, टेक, टेकव्हील, टोअर, एरेय्रेलिस्ट, यूनियन, जहां
Scala.Now स्टार मैंने इसे पढ़ा, और इसे linq की तरह पाया लेकिन अधिक सरल और अधिक अपठनीय। लेकिन scala linux में चला सकते हैं, हाँ? csharp को मोनो की आवश्यकता होती है।
प्रोग्रामिंग भाषा पिज्जा (एक जावा एक्सटेंशन) थी और आपको इस पर एक नज़र डालनी चाहिए। - यह डिक्लेक्टिव तरीके से डेटा को क्वेरी करने के लिए "धाराप्रवाह इंटरफेस" की अवधारणा का उपयोग करता है और यह सिद्धांत रूप में LINQ w / o क्वेरी एक्सप्रेशंस (http://en.wikipedia.org/wiki/Pizza_programming_language) के समान है। लेकिन अफसोस कि इसका पीछा नहीं किया गया था, लेकिन यह जावा में LINQ के समान कुछ पाने का एक तरीका होता।
Java के लिए LINQ के बराबर नहीं है। लेकिन कुछ बाहरी API है जो LINQ जैसे लग रहे है जैसे https://github.com/nicholas22/jpropel-light , https://code.google.com/p/jaque/
आप इस लाइब्रेरी को आज़मा सकते हैं: https://code.google.com/p/qood/
इसका उपयोग करने के कुछ कारण यहां दिए गए हैं: