java - job - title معنى




ما هو مكافئ جافا الخاص بـ LINQ؟ (20)

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


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


JaQu هو المعادل LINQ لجافا. على الرغم من أنه تم تطويره لقاعدة بيانات H2 ، فإنه يجب أن يعمل لأي قاعدة بيانات لأنه يستخدم JDBC.



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

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


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

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


تحقق من tiny-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);
}

ذكر مستخدم مجهول كلمة أخرى ،

Diting هو مكتبة فئة يوفر إمكانات الاستعلام على مجموعات من خلال أساليب قابلة للتسلسل وواجهة مجهولة مثل Linq في .NET. خلافا لمعظم مكتبة المجموعة الأخرى ، تلك التي تستخدم أساليب ثابتة تحتاج إلى تكرار مجموعة كاملة ، يوفر Diting فئة أساسية Enumerable whitch يحتوي على أساليب متسلسلة محسوبة لتنفيذ استعلام على مجموعة أو صفيف.

الأساليب المدعومة: أي ، إرسال ، إتصال ، احتواء ، احتساب ، تمييز ، عنصر ، باستثناء الأول ، الأولأولديفول ، مجموعةالأول ، التداخل ، الانضمام ، الأخير ، الأخيرالوضع الافتراضي ، من نوع ، ترتيبالنظام ، الترتيبالتخليص ، العكسي ، حدد ، حددالعديد ، واحد ، مفردأخر ، تخطي ، skipWhile، take، takewhile، toArray، toArrayList، union، where


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

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


كان هناك لغة برمجة لغة برمجة (ملحق جافا) ويجب أن يكون لديك نظرة عليها. - يستخدم مفهوم "الواجهات البينية" لاستعلام البيانات بطريقة تفصيلية ، وهو مطابق من حيث المبدأ لـ LINQ w / o تعبيرات الاستعلام (http://en.wikipedia.org/wiki/Pizza_programming_language). ولكن للأسف لم تتم متابعته ، ولكن كان من الممكن الحصول على شيء مماثل لـ LINQ في جافا.


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


لا يوجد شيء مثل LINQ لجافا.


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

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

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


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

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

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


هناك حل بديل ، 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();

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

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

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


والآن بعد أن يدعم Java 8 lambdas ، من الممكن إنشاء واجهات برمجة تطبيقات Java تشبه LINQ عن قرب.

http://www.jinq.org/ هي واحدة من هذه المكتبات LINQ http://www.jinq.org/ الجديدة لـ Java.

أنا مطور هذه المكتبة. ويستند إلى خمس سنوات من البحث على استخدام التحليل البوتيكي لترجمة جافا إلى استعلامات قاعدة البيانات. على غرار الطريقة التي تستخدم بها C # D-LINQ هي طبقة الاستعلام التي تقع على قمة Entity Framework ، تكون Jinq قادرة على التصرف كطبقة استعلام في أعلى JPA أو jOOQ. لديه دعم للتجميع والمجموعات وطلبات البحث الفرعية. حتى إريك ماير (منشئ LINQ) اعترف Jinq .


يمكنك استخدام سكالا ، وهو مماثل في بناء الجملة ، وربما في الواقع أكثر قوة من 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 المتسلسلة.


تتوفر 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 .


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