我有C#编程方面的经验,但是我需要在Java项目中改变一些东西,所以我的问题是JAVA在C#中有类似的LINQ吗?我需要用Java查询列表.
这完全取决于你想做什么.使用匿名类可以更加冗长地模仿C#的lambda表示法概念.所以你可以创建一个Where带a 的方法Function<T, bool>,where Function<T1, TReturn>是一个有单个方法的类(例如Execute).我知道番石榴有这样的东西.
那个想法就是这样说:
Iterable<Ball> redBalls = Enumerable.Where(balls,
new Function<Ball, bool>() {
public bool Execute(Ball b) { return b.getColor() == Color.Red; }
});
Run Code Online (Sandbox Code Playgroud)
但是对于所有这些工作,你可能也做到了没有Linq:
List<Ball> redBalls = new ArrayList<Ball>();
for(Ball ball in balls) {
if(ball.getColor() == Color.Red) {redBalls.add(ball);}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当你将lambda表达式,推断类型,属性和扩展方法与C#的方式结合起来时,它与你可以做的事情相去甚远.
var redBalls = balls.Where(b => b.Color == Color.Red);
Run Code Online (Sandbox Code Playgroud)
像这样的代码只有在Java实现lambda表达式时才有可能,该表达式是为版本7安排的,但是被推回到"下一个版本".而LINQ to SQL或LINQ to Entities之类的东西只有在获得表达式树时才有可能,我认为它甚至不在路线图中.
编辑
但是,有些人提出了复杂的库来模拟这种行为.许多人使用"魔术字符串"来执行他们无法提供编译器检查值的查询部分.LambdaJ使用代理对象使编译器认为您正在使用其中一个对象,这允许您使用编译检查调用getter和setter方法,如下所示:
List<Person> redBalls = filter(having(
on(Ball.class).getColor(), equalTo(Color.RED)),
balls);
Run Code Online (Sandbox Code Playgroud)
这些非常聪明,但目前还没有一个能够真正匹配LINQ的简单性.
| 归档时间: |
|
| 查看次数: |
2318 次 |
| 最近记录: |