2016-11-30 55 views
5

我想在我的Android應用程序中過濾Java中的對象列表,爲此我遵循this answer(Java 8建議),但是作爲Lambdas在Android SDK中,不支持,我用gradle-retrolambda,但我得到這個運行時錯誤
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)使用gradle-retrolambda和Lightweight-Stream-API過濾Android中的對象列表

這是我使用的代碼行:

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

我相信它應該gradle這個工作-retrolambda sh應該在Java7上照顧Lambdas。

接下來,我想Lightweight-Stream-APIgradle這個-retrolambda一起,改變了一點點我的代碼,根據輕,流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>>) 

我也嘗試過明確的類型轉換的StreamList<CaseDetails>但沒有工作(當然)。

我試過Slack社區,SO聊天室,但找不到解決方案。我發現對我的問題最接近的是這個question,但它是一個不同的錯誤。
謝謝

回答

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

希望這有助於。

+0

明白了。我的'Collectors'是之前導入的Java7類,它繼續使用相同的類。非常感謝你和@Jahnold – Yankee

5

不幸的是,Retrolambda不支持流式傳輸。從文檔:

Retrolambda lets you run Java 8 code with lambda expressions, method references and try-with-resources statements on Java 7, 6 or 5

對於輕量級流API的一個補丁包,你可以嘗試:

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

另外,您可以使用RxJava

實現類似的東西
+0

謝謝,我也嘗試使用Apache Commons與Predicates,但也面臨一些錯誤。我會試一試,謝謝你的幫助。 – Yankee

+0

另外,不是Lightweight-Stream-API能夠彌補retrolambda這個缺點嗎?我如何解決我提到的第二個錯誤? – Yankee

+1

我還沒有試過Lightweight-Steam-API只有streamsupport庫。它確實有效,但由於改變了界面名稱,我經常發現像上面這樣的問題 - 我認爲這是問題所在。我現在只是使用Rx – Jahnold