Linq喜欢Java

Dam*_*mir 1 c# java linq

我有C#编程方面的经验,但是我需要在Java项目中改变一些东西,所以我的问题是JAVA在C#中有类似的LINQ吗?我需要用Java查询列表.

Str*_*ior 6

这完全取决于你想做什么.使用匿名类可以更加冗长地模仿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的简单性.