我在这里读过这个post。但是我仍然无法在minSdkVersion<上运行包含Java 8 Stream API功能的代码,如下所示: 24。
List<Car> newCars = cars.stream()
.filter(s -> s.getColor().equals("red"))
.collect(Collectors.toList());
由于错误消息
,这不会运行调用需要API级别24(当前最小值为15):java.util.Collection#stream
那么有人知道解决方案吗?
答案 0 :(得分:46)
您不能在API级别上使用Java8流&lt; 24。
但是,有些库反向移植了一些流功能
https://github.com/aNNiMON/Lightweight-Stream-API
https://github.com/konmik/solid
https://sourceforge.net/projects/streamsupport/(@sartorius在评论中提及)
[更新k3b 2019-05-23]
https://github.com/retrostreams/android-retrostreams是来自streamsupport的衍生产品,它利用Android Studio 3.x D8 / desugar工具链的功能来使用界面默认&amp; Jar文件边界的静态方法。还有其他android-retroXXX的链接,即CompletableFuture。
答案 1 :(得分:9)
自DexGuard版本8.2起,可以在Android设备
此功能还将在不久的将来包含在ProGuard中,敬请期待。
编辑:已经存在beta版本的Proguard 6.1.0支持向后移植Java 8流和时间API。
答案 2 :(得分:2)
参加聚会可能会有点晚,但是我刚刚看到,如果我们使用java8.util.stream.StreamSupport
,那么我们可以运行相同的函数编程方法并在Api 24之前使用它。例如,取自web3j-
StreamSupport.stream(transactionReceipt.getLogs())
.map(log -> extractEventParameters(event, log))
.filter(Objects::nonNull)
.collect(Collectors.toList());
答案 3 :(得分:2)
Yes, it is!从AGP 4.0.0开始,我们可以使用Stream API和其他一些Java 8+ API(例如 java.time
)
对应用程序的 build.gradle 所做的最小更改:
android {
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}
答案 4 :(得分:-1)
我想使用的另一种解决方案是静态地使用Kotlin对Java代码集合的扩展,如果该项目当然支持这两者:
List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
与.map
,.reduce
,.first
,...等等相同
答案 5 :(得分:-4)
创建一个界面。
document.addEventListener('dragstart', function (event) {
event.dataTransfer.setData('Text', event.target.innerHTML+"\n");
});
创建过滤方法。
public interface Pre<T,R> {
R get(T item);
}
使用代码
public static <T> List<T> Filter(List<T> list, Pre<T,Boolean> pre) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
{
return list.stream().filter(p -> pre.get(p)).collect(Collectors.toList());
}
else
{
List<T> col = new ArrayList<T>();
for (int i = 0 ; i < list.size() ; i++)
if (pre.get(list.get(i)))
col.add(list.get(i));
return col;
}
}