Có thư viện nào trong Java gần cung cấp chức năng của Linq không?
Có thư viện nào trong Java gần cung cấp chức năng của Linq không?
Câu trả lời:
Để có được cú pháp truy vấn LINQ đầy đủ, bạn sẽ cần một bản cập nhật cho đặc tả ngôn ngữ và trình biên dịch hỗ trợ các từ khóa và cấu trúc cú pháp mới. Điều này vượt xa hầu hết các độc giả ở đây.
Để có được cú pháp chuỗi phương thức giống như Linq trong Java trông và hoạt động giống như những gì trong C #, bạn cần hai điều mà Java không hỗ trợ; các phương thức mở rộng (các phương thức tĩnh có thể được áp dụng cho một thể hiện như thể nó là một phương thức thể hiện) và các biểu thức lambda (các đại biểu ẩn danh). Tuy nhiên, hai cái đó có thể bị giả mạo với các cấu trúc Java hiện có, nếu bạn sẵn sàng chịu thêm một chút chi tiết mã hóa. Một điều tôi thấy đặc biệt tuyệt vời về Java là khả năng tạo các triển khai giao diện ẩn danh; áp dụng cho một giao diện với một chức năng thuần túy, về cơ bản cho phép các đại biểu ẩn danh đơn giản, miễn là bạn có giao diện cho mỗi chữ ký phương thức bạn sẽ cần.
Vì vậy, phía IEnumerable (Iterable for the Javahead) của Linq, như một chuỗi phương thức, có thể xấp xỉ bằng Java; về cơ bản bạn sẽ triển khai nó như một giao diện lưu loát điều khiển một đơn nguyên. Bạn sẽ cần một lớp như một LinqIterable
, thực hiện Iterable, rằng:
Vì vậy, bạn có thể có thể định nghĩa một thư viện "thông thạo" sẽ cho phép một câu lệnh như:
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;}});
Tạo thư viện thực tế là một bài tập vượt xa phạm vi của câu trả lời trên Internet Q & A. Tôi chỉ nói rằng nó có thể, không dễ dàng.
Cây biểu hiện không phải là khoa học tên lửa, nhưng nó sẽ là một dự án quan trọng để thực hiện những gì .NET có trong lĩnh vực này; bạn không chỉ cần khả năng xây dựng một cây biểu thức, bạn còn cần có khả năng "biên dịch" cây này một cách nhanh chóng bằng cách sử dụng mã byte phát ra; Tôi không biết phản xạ của Java có mạnh đến thế không.
Xem:
Không. Linq yêu cầu rất nhiều tính năng langage mà Java chỉ cần có
Sử dụng Scala , vì những lý do được giải thích ở đây :
sử dụng cổng .NET của Scala. Nó cung cấp cho bạn toàn quyền truy cập vào mọi thứ trong .NET, rõ ràng bao gồm LINQ.
Nếu bạn không thể, bạn có thể thử sử dụng lib như functionjava hoặc lambdaj , nhưng bạn sẽ không thực sự đến gần với LINQ.
Tôi sẽ thêm ổi vào danh sách các thư viện có thể giúp bạn đạt được một số điều mà LINQ làm.
Nhưng như những người khác đã chỉ ra, không có Java tương đương.
Bạn có thể sử dụng Korma , DSL cho các truy vấn SQL được viết bằng Clojure.
Cú pháp khá gọn gàng:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Bạn có thể gọi điều này khá dễ dàng từ Java bằng cách nhập các thư viện Clojure có liên quan và chỉ cần sử dụng interj Clojure / Java bình thường.
Không có một tính năng gốc trong java bắt chước linq. Tuy nhiên, có một số API cung cấp cùng chức năng.
Ví dụ, bài đăng trên blog này có một bình tùy chỉnh để sao chép linq.
http://javaworld Worldwide.blogspot.in/2012/09/linq-in-java.html
Và đây là một ví dụ sử dụng API từ bài đăng:
Giả sử chúng ta có một đối tượng Động vật chứa tên và ID được thể hiện bằng một danh sách animals
. Nếu chúng tôi muốn lấy tất cả các tên Động vật có chứa 'o' từ danh sách animals
, chúng tôi có thể viết truy vấn sau
from(animals).where("getName", contains("o")).all();
Có hai API khác được tham chiếu trong bài đăng trên blog: lambdaJ và jLinq
where("getName", ...)
.