java معنى - ما هو مكافئ جافا الخاص بـ LINQ؟




title job (25)

بالنسبة إلى LINQ (LINQ to Objects) ، سيكون لـ Java 8 شيئًا مكافئًا ، راجع Project Lambda .

لديها LINQ Enumerable لالكائنات التمديدات مثل stuffs . ولكن بالنسبة لأشياء LINQ الأكثر تعقيدًا مثل Expression و ExpressionTree (هذه مطلوبة لـ LINQ إلى SQL ومقدمي LINQ الآخرين إذا كانوا يريدون توفير شيء محسّن وحقيقي) ، فلا يوجد أي تعادل بعد لكن ربما سنرى ذلك في المستقبل :)

لكنني لا أعتقد أنه سيكون هناك أي شيء مثل استعلامات التصريحات على جافا في المستقبل.

ما هو مكافئ جافا لـ LINQ؟


تتوفر Lambdas الآن داخل Java 8 على شكل JSR-335 - Lambda Expressions for JavaTM Programming Language

استكمال : تم الآن الافراج عن JDK8 الذي يحتوي على lambda المشروع. يجدر الاستيلاء على نسخة من Java 8 in Action لا تزال حاليًا MEAP.

احصل على قراءة لمقالات براين جويتز المتعلقة باللامداس لفهم لائق لكيفية تنفيذ اللامداس ضمن JDK8 مع اكتساب فهم أيضًا للتيارات ، والتكرار الداخلي ، ومقصور الدوائر القصيرة ، ومراجع المنشئ .. كما يمكنك الاطلاع على JSR أعلاه للحصول على المزيد من الأمثلة .

لقد قمت بكتابة مدونة حول بعض مزايا استخدام lambdas في JDK8 تسمى The Power of the Arrow ، وكذلك NetBeans 8 لديه دعم كبير لتحويل التركيبات إلى JDK8 والتي قمت أيضًا بالتدوين حول Migrating إلى JDK 8 مع NetBeans .


كما في عام 2014 ، أستطيع أن أقول أخيرا أن LINQ هو في النهاية هناك في جافا 8.لا حاجة إلى البحث عن بديل LINQ بعد الآن.


يمكنك تجربة مكتبتي CollectionsQuery . يسمح بتشغيل LINQ مثل استعلامات عبر مجموعات من الكائنات. لديك لتمرير المسند ، تماما كما هو الحال في LINQ. إذا كنت تستخدم 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();

يمكنك أيضا استخدامه في Java8 ، أو في java القديمة مع RetroLambda وهو مكون إضافي ، ثم سيكون لديك بنية جديدة خيالية:

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

إذا كنت بحاجة إلى تشغيل استعلامات DB ، يمكنك البحث عن JINQ ، كما ذكر أعلاه ، ولكن لا يمكن إعادتها بواسطة RetroLambda ، doe لاستخدام lambdas المتسلسلة.


Scala.Now أنا نجم قرأته ، ووجدته مثل linq لكن أكثر بساطة وأكثر غير قابل للقراءة. ولكن يمكن تشغيل scala في لينكس ، نعم؟ تشورب تحتاج مونو.


حاولت 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 لكنها تبدو مثيرة للاهتمام.


ربما لا تكون الإجابة التي تأملها ، ولكن إذا كان جزء منك Clojure في مجموعات (البحث ، الفرز ، التصفية ، التحولات ، التحليل) قد تأخذ في الاعتبار كتابة بعض الحصص الدراسية في Clojure أو Scala .

بسبب طبيعتها الوظيفية ، فإن العمل مع المجموعات هو أفضل ما لديها. ليس لدي الكثير من الخبرة مع Scala ، ولكن مع Clojure ، ربما تجد Linq أكثر قوة في متناول يديك ، وبعد تجميعها ، سوف تتكامل الصفوف التي تنتجها بشكل سلس مع بقية قاعدة الكود.


فقط لإضافة بديل آخر: جافا 6 لديها حل لاستعلامات قاعدة بيانات آمنة javax.persistence.criteria باستخدام حزمة javax.persistence.criteria .

على الرغم من أنني يجب أن أقول أن هذا ليس حقاً LINQ ، لأنه مع LINQ يمكنك الاستعلام عن أي IEnumerable.


يبدو أن Linq الذي يتحدث عنه الجميع هنا هو مجرد LinqToObjects. والتي أعتقد أنها تقدم فقط وظائف يمكن بالفعل تحقيقها اليوم في Java ، ولكن مع بنية قبيحة حقا.

ما أراه القوة الحقيقية لـ Linq في .Net هو أنه يمكن استخدام تعبيرات lambda في سياق يتطلب إما تفويضًا أو تعبيرًا ، ثم يتم تجميعها في النموذج المناسب. هذا هو ما يسمح لأشياء مثل LinqToSql (أو أي شيء آخر غير LinqToObjects) للعمل ، ويسمح لهم أن يكونوا بناء جملة مماثل لـ LinqToObjects.

يبدو أن جميع المشاريع المشار إليها أعلاه تقدم فقط قدرات LinqToObjects. مما يجعلني شيء أن وظيفة LinqToSql من نوع ليست في الأفق لجافا.


هناك حل بديل ، Coollection .

لم تتظاهر Coolection بأن تكون lambda الجديدة ، ومع ذلك فنحن محاطون بمشاريع جاوة القديمة القديمة حيث سيساعد هذا libda. من البسيط حقًا الاستخدام والتوسيع ، حيث لا تغطي سوى الإجراءات الأكثر استخدامًا للتكرار على المجموعات ، مثل:

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

AC # JaQue الحل هو JaQue ، الذي يقدم Expression Trees لـ Java Lambdas. علاوة على ذلك يمكن تنفيذ موفري LINQ خاصة بالنطاق.


هناك مكتبة جيدة جدا يمكنك استخدامها لهذا الغرض.

تقع هنا: https://github.com/nicholas22/jpropel-light

لن يكون Lambdas متاحًا حتى Java 8 بالرغم من ذلك ، لذا فإن استخدامه مختلف قليلاً ولا يشعر بأنه طبيعي.


هناك العديد من معادلات LINQ لـ Java ، انظر here للمقارنة.

بالنسبة لنوع إطار عمل Quaere / LINQ ، فكر في استخدام Querydsl . يدعم Querydsl مجموعات JPA / Hibernate و JDO و SQL و Java.

أنا المشرف على Querydsl ، لذا فإن هذه الإجابة متحيزة.


لا حقا ما يعادل "Linq إلى SQL" جافا. لكن شيئًا قريبًا منه. Querydsl


يمكنك تحديد العناصر الموجودة في مجموعة (وأكثر) بطريقة أكثر قابلية للقراءة باستخدام مكتبة lambdaj

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

له بعض المزايا على مكتبة Quaere لأنه لا يستخدم أي سلسلة سحرية ، فهو آمن تمامًا ، وفي رأيي يقدم DSL أكثر قابلية للقراءة.


بالنسبة للمجموعات الوظيفية الأساسية ، قامت Java 8 بتضمينها ، معظم اللغات الرئيسية غير Java JVM قد تم بناؤها (Scala ، Clojure ، الخ) ، ويمكنك الحصول على إضافة libs لإصدارات Java السابقة.

من أجل الوصول الكامل للغة إلى قاعدة بيانات SQL ، فإن Scala (يعمل على JVM) يحتوي على Slick


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

الفرز (متاح أيضًا لـ Java 7)

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

التجميع (متاح أيضًا لـ Java 7)

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

الانضمام (متوفر أيضًا لـ Java 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 ما لم تستخدم javacc لإنشاء مكافئ خاص بك.

حتى ذلك اليوم عندما يجد شخص ما طريقة مجدية للقيام بذلك ، هناك بعض البدائل الجيدة ، مثل


LINQ to Objects - أضافت JAVA 8 إلى Stream API الذي يضيف الدعم لعمليات النمط الوظيفي على تدفقات القيم:

حزمة java.util.stream

شرح Java 8: تطبيق Lambdas على مجموعات Java

LINQ إلى SQL / NHibernate / etc. (الاستعلام عن قواعد البيانات) - خيار واحد هو استخدام JINQ الذي يستخدم أيضًا ميزات JAVA 8 الجديدة وتم إصداره في 26 فبراير 2014 على جيثب: https://github.com/my2iu/Jinq

يوفر Jinq للمطورين طريقة سهلة وطبيعية لكتابة استعلامات قاعدة البيانات في Java. يمكنك معالجة بيانات قاعدة البيانات مثل كائنات جافا العادية المخزنة في مجموعات. يمكنك تكرارها وتصفية هذه الأوامر باستخدام أوامر Java العادية ، وسيتم ترجمة كل شفرتك تلقائيًا إلى استعلامات قاعدة البيانات المحسنة. وأخيرًا ، تتوفر استعلامات LINQ على نمط Java!

موقع مشروع JINQ: http://www.jinq.org/


يمكنك استخدام سكالا ، وهو مماثل في بناء الجملة ، وربما في الواقع أكثر قوة من linq.



انظر SBQL4J . إنها لغة استعلام قوية آمنة من النوع مدمجة مع جافا. يسمح لكتابة استعلامات معقدة ومتضاعفة المتداخلة. هناك الكثير من المشغلين ، يمكن استدعاء أساليب جافا داخل الاستعلامات حتى المنشئات. تتم ترجمة الاستعلامات إلى رمز Java خالص (لا يوجد انعكاس في وقت التشغيل) ، وبالتالي يكون التنفيذ سريعًا جدًا.

تحرير: حسنا ، حتى الآن SBQL4J هو ملحق فقط إلى لغة جافا الذي يعطي قدرات الاستعلام مماثلة ل LINQ. هناك بعض المشاريع المثيرة للاهتمام مثل Quaere و JaQue ولكنها ليست سوى واجهة برمجة التطبيقات ، وليس امتدادًا لغويًا / دلالة مع أمان نوعي قوي في وقت التحويل البرمجي.


لا يوجد مثل هذه الميزة في جافا. باستخدام واجهة برمجة التطبيقات الأخرى ، ستحصل على هذه الميزة. مثل افترض أن لدينا كائن حيواني يحتوي على الاسم والمعرف. لدينا كائن قائمة لها كائنات حيوانية. الآن إذا أردنا الحصول على كل اسم الحيوان الذي يحتوي على "o" من كائن القائمة. يمكننا كتابة الاستعلام التالي

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

سيظهر عبارة الاستعلام أعلاه قائمة بالحيوانات التي تحتوي على أحرف أبجدية باسمها. مزيد من المعلومات يرجى الدخول من خلال بلوق. http://javaworldwide.blogspot.in/2012/09/linq-in-java.html


وبصرف النظر عن الاختلافات المذكورة بالفعل ، تجدر الإشارة إلى أنه منذ Java 8 ، يستبدل HashMap بشكل ديناميكي العقد (قائمة مرتبطة) المستخدمة في كل مجموعة مع TreeNodes (شجرة حمراء وسوداء) ، بحيث أنه حتى في حالة حدوث تصادمات عالية ، عند البحث

O (log (n)) لـ HashMap Vs O (n) في Hashtable .

* لم يتم تطبيق التحسين السابق على Hashtable حتى الآن ، ولكن فقط على HashMap و LinkedHashMap و ConcurrentHashMap .

لمعلوماتك ، حاليا ،

  • TREEIFY_THRESHOLD = 8 : إذا كان الدلو يحتوي على أكثر من 8 عقد ، يتم تحويل القائمة المرتبطة إلى شجرة متوازنة.
  • UNTREEIFY_THRESHOLD = 6 : عندما يصبح الدلو صغيرًا جدًا (بسبب الإزالة أو تغيير الحجم) يتم تحويل الشجرة إلى قائمة مرتبطة.






java linq