[英]best way or similar lambda expression or linq on android (eclipse)
例如,如果我有
ArrayList<Product> productlist = new ArrayList<Product> ();
你怎么得到product.code
等于1和2的所有产品?
有可以使用的图书馆吗?
在c#我可以使用
productlist.where(product=> product.code.contains(arraywithproductcode)).ToList();
或其他方式使用
var newlist=(from p in productlist join a in arraywithproduct on a.product equals a select p);
我怎么能在java for android中得到它?
Android(或Java)中没有lambda表达式。
您可能希望看到这些选项(但尚未在Android中测试过它们):
另外,请参阅此DZone链接和此 链接 。 stackoverflow文章提到了这一点 。
Lambda表达式现在可在Java SE 8中获得。有关更多信息,请访问:
根据您的使用情况,您可以创建一个新列表,迭代旧列表并将符合条件的列表添加到新列表中。
如果你想避免这种情况并且可以忍受Guavas Collections2.filter()
方法的限制,你可以这样做:
Collection<Product> filtered = Collections2.filter(productlist, new Predicate<Product>() {
@Override
public boolean apply(Product p) {
return p.code == 1 || p.code == 2;
}
});
也许你可以尝试这个Java库: https : //code.google.com/p/qood/
它在没有任何getter / setter的情况下处理数据,因此它比LINQ更灵活。
在您的产品案例中,它可能看起来像:
final String[] productCodeArray = { ... };
final QModel products = ...; //QModel {PROD_CODE, PROD_FIELD1, PROD_FIELD2, ...}
final QModel filtered = products.query()
.where(QNew.<String>whereIn("PROD_CODE").values(productCodeArray))
.result().debug(-1);
正如这篇介绍性文章Java 8 Stream on Android - Medium所示 ,有两个宝石似乎可以很好地结合在一起,提供你所要求的类似LINQ的体验。
这些被称为retrolambda和Stream 。
添加奖金,他们不需要Java 8,因此使用它们与旧版本的Android兼容。
你的C#代码:
productlist
.where(product=> product.code.contains(arraywithproductcode))
.ToList();
会转向这样的事情:
productlist
.filter(product -> product.code.contains(arraywithproductcode))
.collect(Collectors.toList());
通常的评论是:“你真的需要在最后把它变成一个列表吗?也许懒惰评估的流是你真正想要的。”
对于其他示例,请使用NNiMON / Android-Java-8-Stream-示例:使用带有Retrolambda和Lightweight-Stream-API的Java 8功能的演示应用程序
我们在这里使用Android Studio,但如果它不适用于Eclipse,我会感到惊讶。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.