Linq의 기능을 제공하는 것에 가까운 Java 라이브러리가 있습니까?
Linq의 기능을 제공하는 것에 가까운 Java 라이브러리가 있습니까?
답변:
전체 LINQ 쿼리 구문을 얻으려면 새로운 키워드 및 구문 구조를 지원하는 언어 사양 및 컴파일러를 업데이트해야합니다. 이것은 대부분의 독자를 넘어선 것입니다.
C #에있는 것처럼 보이고 작동하는 Java에서 Linq와 유사한 메소드 체인 구문을 얻으려면 Java가 지원하지 않는 두 가지가 필요합니다. 확장 메소드 (인스턴스 메소드 인 것처럼 인스턴스에 적용 할 수있는 정적 메소드) 및 람다 표현식 (익명 델리게이트). 그러나 약간의 추가 코딩 세부 정보가 필요한 경우 기존 Java 구성으로 스푸핑 될 수 있습니다. Java에서 특히 놀라운 점은 익명 인터페이스 구현을 만드는 기능입니다. 필요한 단일 메소드 서명에 대한 인터페이스가있는 경우 기본적으로 단순 익명 위임을 허용하는 단일 순수 함수가있는 인터페이스에 적용됩니다.
따라서 메소드 체인으로서 Linq의 IEnumerable (Javaheads에 대해 반복 가능) 측은 Java로 근사화 할 수 있어야합니다. 기본적으로 모나드를 제어하는 유창한 인터페이스로 구현합니다. LinqIterable
Iterable을 구현하는 다음 과 같은 클래스가 필요 합니다.
따라서 다음과 같은 문장을 허용하는 "유창한"라이브러리를 정의 할 수 있습니다.
Map<String, Integer> results = Linq.FromIterable(sourceList)
.Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
.OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
.Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
.ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});
실제 라이브러리를 만드는 것은 인터넷 Q & A에 대한 답변 범위를 넘어서는 연습입니다. 나는 그것이 가능하지 않다고 말했다.
표현 트리는 로켓 과학이 아니지만이 영역에서 .NET의 기능을 구현하는 중요한 프로젝트가 될 것입니다. 표현식 트리를 작성하는 기능이 필요할뿐만 아니라 방출 된 바이트 코드를 사용하여이 트리를 즉석에서 "컴파일"할 수 있어야합니다. Java의 반영이 그토록 강력한 지 모르겠습니다.
보다:
Linq는 Java에 거의없는 언어 기능이 많이 필요합니다.
Scala의 .NET 포트를 사용하십시오. LINQ가 포함 된 .NET의 모든 항목에 대한 완전한 기본 액세스 권한을 제공합니다.
당신이 할 수 없다면 , functionjava 또는 lambdaj 와 같은 libs를 사용하려고 시도 할 수 있지만 실제로 LINQ에 가깝지는 않습니다.
구아바를 추가하겠습니다LINQ가 수행하는 작업 중 일부를 달성하는 데 도움이 될 수있는 라이브러리 목록에 를 .
그러나 다른 사람들이 지적했듯이 순수한 Java에는 동등한 것이 없습니다.
Clojure로 작성된 SQL 쿼리 용 DSL 인 Korma를 사용할 수 있습니다 .
구문은 매우 깔끔합니다.
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
관련 Clojure 라이브러리를 가져오고 일반 Clojure / Java interop을 사용하여 Java에서이를 쉽게 호출 할 수 있습니다.
linq를 모방하는 기본 기능은 Java에 없습니다. 그러나 동일한 기능을 제공하는 몇 가지 API가 있습니다.
예를 들어이 블로그 게시물에는 linq를 복제 할 사용자 정의 jar이 있습니다.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
그리고 이것은 게시물에서 API 사용법의 예입니다.
이름과 ID가 포함 된 Animal 객체가 목록으로 표시되어 있다고 가정합니다 animals
. 목록에서 'o'를 포함하는 모든 동물 이름을 얻으려면 animals
다음 쿼리를 작성할 수 있습니다.
from(animals).where("getName", contains("o")).all();
where("getName", ...)
.