是否可以在Android API上使用Java 8 Stream API< 24?

时间:2016-09-15 15:33:03

标签: java android java-8 java-stream

我在这里读过这个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

那么有人知道解决方案吗?

6 个答案:

答案 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设备streamsupport库和DexGuard会将所有Java 8流API调用转换为提供的库。无需其他处理,开发人员只需使用提供的Java 8流API进行编码即可。依赖关系也会自动翻译,因此可以将具有Java 8功能的库用于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;
        }
    }