C# linq 的 Java/Android 最佳等效项 [重复]

Posted

技术标签:

【中文标题】C# linq 的 Java/Android 最佳等效项 [重复]【英文标题】:Java/Android best equivalent for C# linq [duplicate] 【发布时间】:2015-12-15 06:22:03 【问题描述】:

让我们看看这个示例 C# 代码:

List<int> numbers = new List<int>()  5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ;
int numCount = numbers.Where(n => n < 3 || n > 7).Count();

我对 Java 中最接近的等价物很感兴趣,显然不需要编写花哨的 for/foreach 循环来迭代集合。

据我所知,Java 中没有确切的 linq equivalnet,但是我还是 Java 编程的初学者,有什么可以推荐给我的吗?我实际上正在寻找最紧凑和优雅的方式来在 Java 中实现相同的结果

[添加] 所以,谢谢大家的回复。但是,我需要在 android 上使用它,但似乎我不能。有什么解决办法吗?

(对不起,它是重复的)

[添加] 有人试过这个吗? http://sourceforge.net/projects/streamsupport/

【问题讨论】:

@caesay 如果您向下滚动答案,您会发现Java 8 streams 将在这里完成工作 @Sybren:我就是答案之一。我建议一个重复的问题。这里的问题是“我如何根据谓词过滤数组”,这也是我发布的链接的问题。 @是的,答案也在您的链接中,但也在我的链接中,所以我不明白您为什么不同意我的副本。 【参考方案1】:

结合 Lambda 表达式的 Java 8 Streaming API 将完成这项工作:

    int[] numbers = new int[]  5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ;
    long count = Arrays.stream(numbers).filter(n -> n < 3 || n > 7).count();

【讨论】:

谢谢,我更新了我的问题。我在使用 Android,所以我迷路了吗? 遗憾的是,在支持 Java 8 之前,它无法在 android 上运行。【参考方案2】:

在 Java8 中:

Arrays.stream(numbers).filter(n -> n < 3 || n > 7).count();

针对您对 android 的要求,请查看 lambdaj:https://code.google.com/p/lambdaj/ 它与 android 兼容 - 尽管语法不同。您必须查看文档,因为我从未使用过它。您也可以查看https://github.com/wagnerandrade/coollection

【讨论】:

Lambdaj 看起来很有前途,它不像 C# linq 那样清晰,但总比没有 我发现 Guava Collections + lambdas(或方法参考)是 Android 的最佳解决方案。不幸的是,Java 8 流 api 不是一个解决方案,因为它需要最少的 api Android 7。Guava 提供了类似的 api,但它也适用于任何 Android 版本。我无法回答我的问题,因为管理员已决定将其标记为重复【参考方案3】:

使用Java8 流的工作方式非常相似:

int numcount = Arrays.stream(numbers).filter(n -> n < 3 || n > 7).count();

【讨论】:

【参考方案4】:

如果您需要 Java 7 或更早版本,请尝试 google 代码中提供的 lambdaj 库。如果不相同,它将提供类似的功能。

【讨论】:

以上是关于C# linq 的 Java/Android 最佳等效项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在实体中查找对象和加载实体、Foreach 或在哪里使用 LinQ ON C# 的最佳性能?

使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法

在 C# 中组合两个或多个字节数组的最佳方法

LINQ 更新过程 - 最佳实践

哪本书是学习 Linq 的最佳书籍,包括 Linq to Entities? [关闭]

C# 之 LINQ简析