繁体   English   中英

android上最好的方法或类似的lambda表达式或linq(eclipse)

[英]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中获得。有关更多信息,请访问:

Lambda表达式

根据您的使用情况,您可以创建一个新列表,迭代旧列表并将符合条件的列表添加到新列表中。

如果你想避免这种情况并且可以忍受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的体验。

这些被称为retrolambdaStream

添加奖金,他们不需要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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM