【问题标题】:best way or similar lambda expression or linq on android (eclipse)android(eclipse)上的最佳方式或类似的lambda表达式或linq
【发布时间】:2013-08-09 19:13:44
【问题描述】:

例如,如果我有

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中得到它?

【问题讨论】:

标签: java android linq lambda


【解决方案1】:

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

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

另外,请参阅 this DZone linkthis one。一个stackoverflow帖子mentions this

更新

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

Lambda Expressions

【讨论】:

  • Lambdas 将于明年进入 Java 版本 8。
【解决方案2】:

如这篇介绍性文章 Java 8 Stream on Android — 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());

按照通常的说法:“你真的需要在最后把它变成一个列表吗?也许延迟评估的流才是你真正想要的。”

对于其他示例,请使用aNNiMON/Android-Java-8-Stream-Example: Demo app of using Java 8 features with Retrolambda and Lightweight-Stream-API

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

【讨论】:

    【解决方案3】:

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

    如果你想避免这种情况并且可以忍受 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;
        }
    });
    

    【讨论】:

      【解决方案4】:

      也许你可以试试这个 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);
      

      【讨论】:

        猜你喜欢
        • 2012-07-30
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 2011-01-07
        • 2021-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多