在安卓(Eclipse)上,最佳的Lambda表达式或类似LINQ的方法是什么?

4
例如,如果我有以下内容:
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);

我该如何在Android Java中获取它?

请查看TotallyLazy库:http://code.google.com/p/totallylazy/ - intrepidis
4个回答

2

1
Lambda表达式将在明年Java 8版本中推出。 - intrepidis

1

正如这篇介绍Java 8 Stream在Android上的文章所示,有两个宝石似乎非常搭配,提供了您所要求的类似LINQ的体验。

它们被称为retrolambdaStream

额外的好处是,它们不需要Java 8,因此使用它们与旧版本的Android兼容。

您的C#代码:

productlist
.where(product=> product.code.contains(arraywithproductcode))
.ToList();

会变成这样:

会变成这样:

productlist
.filter(product -> product.code.contains(arraywithproductcode))
.collect(Collectors.toList());

常见的评论是:“你真的需要在最后将其转换为列表吗?也许惰性求值流才是你实际想要的。”

对于其他示例,请使用aNNiMON/Android-Java-8-Stream-Example:使用Java 8功能的演示应用程序,包括Retrolambda和Lightweight-Stream-API

我们在这里使用Android Studio,但如果它不能与Eclipse一起工作,我会感到惊讶。


0
根据您的使用情况,您可以创建一个新列表,迭代旧列表并将符合条件的添加到新列表中。
如果您想避免这种情况,并且可以接受Guava Collections2.filter()方法的限制,您可以这样做:
Collection<Product> filtered = Collections2.filter(productlist, new Predicate<Product>() {
    @Override
    public boolean apply(Product p) {
        return p.code == 1 || p.code == 2;
    }
});

0

也许你可以尝试使用这个Java库:https://code.google.com/p/qood/

它处理数据时不需要getter/setters,因此比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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接