Yan*_*kee 6 java lambda android java-8
我试图在我的Android应用程序中过滤Java中的对象列表,为此我遵循了这个答案(Java 8建议),但由于Android SDK中不支持Lambdas,我使用了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)
这是我正在使用的代码行:
List<CaseDetails> closedCaseDetailsList = caseDetailsList.stream().filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
我相信它应该工作,因为gradle-retrolambda应该在Java7上处理Lambdas.
接下来,根据Lightweight-Stream-API的用法,我尝试了Lightweight-Stream-API以及gradle-retrolambda并稍微改变了我的代码
List<CaseDetails> closedCaseDetailsList = Stream.of(caseDetailsList).filter(item -> item.caseClosed.equals(true)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但它给我一个错误的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>>)
Run Code Online (Sandbox Code Playgroud)
我也尝试过明确地输入类型Stream,List<CaseDetails>但是当然没有用.
我尝试了Slack社区,SO聊天室,但找不到解决方案.我发现问题的最接近的是这个问题,但这是一个不同的错误.
谢谢
不幸的是,Retrolambda没有向后传输流.来自文档:
Retrolambda允许您在Java 7,6 或5上使用lambda表达式,方法引用和try-with-resources语句运行Java 8代码
对于轻量级流API的后端,您可以尝试:
https://sourceforge.net/projects/streamsupport/
或者,您可以使用RxJava实现类似的功能
我只能举一个关于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);
}
}
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
1884 次 |
| 最近记录: |