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);

我怎样才能在java for android中得到它?

4

4 回答 4

2

Android(或 Java)中还没有 lambda 表达式。

您可能希望看到这些选项(虽然尚未在 Android 中测试过):

另外,请参阅此 DZone 链接链接。一个 stackoverflow 帖子提到了这一点

更新

Lambda 表达式现在在 Java SE 8 中可用有关更多信息,请访问:

Lambda 表达式

于 2013-08-09T19:22:33.583 回答
1

如这篇介绍性文章Android 上的 Java 8 Stream — Medium 中所示,有两个 gem 似乎可以很好地结合在一起,以提供您所要求的那种类似于 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-Example:使用带有 Retrolambda 和 Lightweight-Stream-API 的 Java 8 功能的演示应用程序

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

于 2016-06-20T15:28:28.880 回答
0

也许你可以试试这个 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);
于 2014-04-13T09:33:46.043 回答
0

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

如果你想避免这种情况并且可以忍受 GuavasCollections2.filter()方法的限制,你可以这样做:

Collection<Product> filtered = Collections2.filter(productlist, new Predicate<Product>() {
    @Override
    public boolean apply(Product p) {
        return p.code == 1 || p.code == 2;
    }
});
于 2013-08-09T19:30:56.063 回答