Linq와 가장 적합한 Java는 무엇입니까? [닫은]


17

Linq의 기능을 제공하는 것에 가까운 Java 라이브러리가 있습니까?


1
"LINQ의 기능"이 아니라 "LINQ의 구문"을 의미한다고 가정합니다. 동일한 기능을 제공하는 많은 라이브러리가 있습니다 :-)
mikera

Java에 해당하는 것이 Groovy 일 가능성이 높습니다 . 유형 안전을 잃어버린 대신
gnat

답변:


20

전체 LINQ 쿼리 구문을 얻으려면 새로운 키워드 및 구문 구조를 지원하는 언어 사양 및 컴파일러를 업데이트해야합니다. 이것은 대부분의 독자를 넘어선 것입니다.

C #에있는 것처럼 보이고 작동하는 Java에서 Linq와 유사한 메소드 체인 구문을 얻으려면 Java가 지원하지 않는 두 가지가 필요합니다. 확장 메소드 (인스턴스 메소드 인 것처럼 인스턴스에 적용 할 수있는 정적 메소드) 및 람다 표현식 (익명 델리게이트). 그러나 약간의 추가 코딩 세부 정보가 필요한 경우 기존 Java 구성으로 스푸핑 될 수 있습니다. Java에서 특히 놀라운 점은 익명 인터페이스 구현을 만드는 기능입니다. 필요한 단일 메소드 서명에 대한 인터페이스가있는 경우 기본적으로 단순 익명 위임을 허용하는 단일 순수 함수가있는 인터페이스에 적용됩니다.

따라서 메소드 체인으로서 Linq의 IEnumerable (Javaheads에 대해 반복 가능) 측은 Java로 근사화 할 수 있어야합니다. 기본적으로 모나드를 제어하는 ​​유창한 인터페이스로 구현합니다. LinqIterableIterable을 구현하는 다음 과 같은 클래스가 필요 합니다.

  • 모든 Iterable 입력을 LinqIterable 인스턴스로 변환 할 수 있습니다
  • 단일 기능 인터페이스를 수용하고 새로운 LinqIterables를 생성하는 필터링, 그룹화, 연결, 교차, 순서 지정 등과 같은 기본 목록 처리 방법이 있습니다.
  • LinqIterable을 ToList, ToArray, ToMap 등과 같은 "콘크리트"객체로 다시 변환하는 메소드가 있습니다.

따라서 다음과 같은 문장을 허용하는 "유창한"라이브러리를 정의 할 수 있습니다.

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의 반영이 그토록 강력한 지 모르겠습니다.


2
재미있게도 충분한 확장 메서드와 람다식이 모두 Java 8에 있습니다. 아마도 LINQ가 진행되고 있습니까?
lxs

4
확장 방법과 람다가 있다면 .NET Linq의 "Enumerable"측면에 큰 노력을 기울이지 않아도됩니다. 내가 말했듯이 Linq 쿼리를 만드는 키워드를 허용하려면 Java 사양을 변경해야하지만 정직하게 Linq를 사용하면 너무 쉽게 쿼리를 찾지 못했습니다. 메서드 체인으로 표현되고 컴파일러는 Linq 구문을 메서드 체인으로 변환합니다 (대부분의 쿼리와 체인간에 1 : 1을 변환 할 수있는 VS 플러그인이 있습니다). 다음의 실제 디딤돌은 표현 트리 (Queryable Linq)입니다.
KeithS

8

보다:


1
이 자료들 각각에 대해 조금 더 설명해 주시겠습니까? 그리고 질문에 대답 할 때 왜 이러한 자료들을 추천하십니까? "링크 전용 답변" 은 Stack Exchange에서 그다지 환영받지 않습니다
gnat

흠, 나는이 Q가 이미 답변 된 경우라고 생각합니다-복제로 수정해야합니까?
Martijn Verburg

1
@MartijnVerburg-여러 사이트에서 질문을 중복으로 표시 할 수 없습니다. 답은 실제로 혼자있을 수 있어야합니다.
ChrisF

편집 되었으면 좋겠다. 이제 조금 더 도움이 되길 바란다.
Martijn Verburg

5

Linq는 Java에 거의없는 언어 기능이 많이 필요합니다.


4
Java에는 제네릭이 있습니다.
Jonas

6
@Jonas : 사실이지만 LINQ를 지원할만큼 강력한 지 여부는 또 다른 문제입니다.
DeadMG

2
@DeadMG는 여전히 Java에 제네릭이 있습니다.
Mahmoud Hossam

제네릭에 대한 참조를 제거하도록 편집
Tom Squires

3

여기에 설명이유로 Scala를 사용 하십시오 .

Scala의 .NET 포트를 사용하십시오. LINQ가 포함 된 .NET의 모든 항목에 대한 완전한 기본 액세스 권한을 제공합니다.

당신이 할 수 없다면 , functionjava 또는 lambdaj 와 같은 libs를 사용하려고 시도 할 수 있지만 실제로 LINQ에 가깝지는 않습니다.


1
Scala는 라이브러리가없는 Linq와 같은 것을 포함하지 않습니다.
Jonas

1
@Jonas : 그럼요? Java에는 Linq 같은 라이브러리가 포함되어 있지 않습니다 .
back2dos

@ back2dos : 그렇습니다. 그래서 당신은 라이브러리로 대답해야합니다.
Jonas

1
@Jonas : Scala의 표준 라이브러리는 LINQ와 같습니다. 또는 다른 방법으로 : LINQ는 C #을위한 함수형 프로그래밍 관용구 일뿐입니다. 더 자세한 내용은 여기참조하십시오 .
back2dos

@ back2dos : 훌륭한 링크 덕분에 자유롭게 포함시킬 수있었습니다.
Landei

2

구아바를 추가하겠습니다LINQ가 수행하는 작업 중 일부를 달성하는 데 도움이 될 수있는 라이브러리 목록에 를 .

그러나 다른 사람들이 지적했듯이 순수한 Java에는 동등한 것이 없습니다.


무엇을하는지 더 자세히 설명해 주시겠습니까? 그리고 질문에 대한 답변으로 추천하는 이유는 무엇입니까? "링크 전용 답변" 은 Stack Exchange에서 그다지 환영받지 않습니다
gnat

2

Clojure로 작성된 SQL 쿼리 용 DSL 인 Korma를 사용할 수 있습니다 .

구문은 매우 깔끔합니다.

(select user
  (with address)
  (fields :firstName :lastName :address.state)
  (where {:email "korma@sqlkorma.com"}))

관련 Clojure 라이브러리를 가져오고 일반 Clojure / Java interop을 사용하여 Java에서이를 쉽게 호출 할 수 있습니다.


따라서 이것은 Linq over SQL이 아니라 LINQ over Object를 에뮬레이트합니다.
Job

@Job : 예. SQL 용으로 설계되었습니다. 비록 그것이 객체에 맞게 확장 / 적응 할 수없는 이유는 보이지 않습니다.
mikera

2

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

블로그 게시물에서 참조되는 두 가지 다른 API가 있습니다 : lambdaJjLinq


1
정적 유형 검사와 클래스 멤버의 존재 유무를 모두 잃는 것이와 같은 전화를하는 데 약간의 가파른 가격이 될 것 같습니다 where("getName", ...).
9000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.