使用gradle-retrolambda和Lightweight-Stream-API过滤Android中的对象列表 [英] Filter a list of objects in Android using gradle-retrolambda and Lightweight-Stream-API

查看:164
本文介绍了使用gradle-retrolambda和Lightweight-Stream-API过滤Android中的对象列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正试图在我的Android应用程序中过滤Java中的对象列表,为此我遵循此答案( Java 8建议),但由于Android SDK不支持Lambda,我使用 gradle-retrolambda 但是我得到了这个运行时错误

java.lang.NoSuchMethodError:没有接口方法stream()Ljava / util / stream / Stream;在类Ljava / util / List中;或其超类('java.util.List'的声明出现在/system/framework/core-libart.jar中)

I am trying to filter a List of Objects in Java in my Android App, for this I followed this answer (Java 8 suggestion) , but as Lambdas aren't supported in Android SDK, I used gradle-retrolambda but I get this runtime-error
java.lang.NoSuchMethodError: No interface method stream()Ljava/util/stream/Stream; in class Ljava/util/List; or its super classes (declaration of 'java.util.List' appears in /system/framework/core-libart.jar)

这是我正在使用的代码行:

This is the line of code I am using:

List<CaseDetails> closedCaseDetailsList = caseDetailsList.stream().filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList());

我认为它应该有效,因为 gradle-retrolambda 应该照顾Java7上的Lambdas。

I believe it should work as gradle-retrolambda should be taking care of the Lambdas on Java7.

接下来,我尝试了 Lightweight-Stream -API 以及 gradle-retrolambda 并根据Lightweight-Stream-API的使用情况稍微更改了我的代码

Next, I tried Lightweight-Stream-API along with gradle-retrolambda and changed my code a little, according to the usage of Lightweight-Stream-API

List<CaseDetails> closedCaseDetailsList = Stream.of(caseDetailsList).filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList());  

但它给我一个错误 Collectors.toList()

collect
(com.annimon.stream.Collector<? super com.example.yankee.cw.CaseDetails,java.lang.Object,java.lang.Object>)
in Stream cannot be applied
to
 (java.util.stream.Collector<T,capture<?>,java.util.List<T>>) 

我也尝试过明确的类型转换列表< CaseDetails> 但是当然没有用。

I also tried explicitly type-casting the Stream to List<CaseDetails> but that didn't work (of course).

我尝试了Slack社区,SO聊天室但找不到解决方案。我发现问题的最接近的是问题但这是一个不同的错误。

谢谢

I tried Slack communities, SO Chat-rooms but couldn't find a solution. The closest thing I found to my problem was this question but it is a different error.
Thanks

推荐答案

我只能给你一个例子< a href =https://github.com/stefan-zobel/streamsupport =nofollow noreferrer> streamsupport

import java.util.Arrays;
import java.util.List;

import java8.util.stream.Collectors;
import java8.util.stream.StreamSupport;
import static java.lang.Boolean.TRUE;
import static java.lang.Boolean.FALSE;

public class CaseDetails {

    Boolean caseClosed = FALSE;

    public CaseDetails(Boolean caseClosed) {
        this.caseClosed = caseClosed;
    }

    public String toString() {
        return "caseClosed: " + caseClosed;
    }

    public static void main(String[] args) {
        List<CaseDetails> caseDetailsList = Arrays.asList(
                new CaseDetails(TRUE), new CaseDetails(FALSE), new CaseDetails(
                        TRUE));
        List<CaseDetails> closedCaseDetailsList = StreamSupport
                .stream(caseDetailsList)
                .filter(item -> item.caseClosed.equals(TRUE))
                .collect(Collectors.toList());

        System.out.println(closedCaseDetailsList);
    }
}

希望这有帮助。

这篇关于使用gradle-retrolambda和Lightweight-Stream-API过滤Android中的对象列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆