使用gradle-retrolambda和Lightweight-Stream-API过滤Android中的对象列表

时间:2016-11-30 11:05:10

标签: java android lambda java-8

我试图在我的Android应用程序中过滤Java中的对象列表,为此我遵循this answer(Java 8建议),但由于Android SDK不支持Lambdas,我使用{{3但我得到这个运行时错误
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)

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

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

我认为它应该可以正常工作,因为 gradle-retrolambda 应该在Java7上处理Lambdas。

接下来,根据Lightweight-Stream-API

的用法,我尝试了gradle-retrolambda以及 gradle-retrolambda 并稍微更改了我的代码
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>>) 

我还尝试将Stream明确地输入到List<CaseDetails>,但这当然不起作用。

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

2 个答案:

答案 0 :(得分:6)

不幸的是,Retrolambda并没有向后移植流。来自文档:

  

Retrolambda允许您在Java 7,6或5上使用 lambda表达式,方法引用和try-with-resources语句运行Java 8代码

对于轻量级流API的后端,您可以尝试:

https://sourceforge.net/projects/streamsupport/

或者你可以使用RxJava实现类似的东西

答案 1 :(得分:5)

我只能举例说明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);
    }
}

希望这有帮助。