Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在Android API上使用Java 8流API<;24?_Java_Android_Java 8_Java Stream - Fatal编程技术网

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

是否可以在Android API上使用Java 8流API<;24?,java,android,java-8,java-stream,Java,Android,Java 8,Java Stream,我在这里读过。但我仍然无法在minSdkVersions.getColor().equals(“红色”)) .collect(Collectors.toList()); 由于出现错误消息,此操作无法运行 调用需要API级别24(当前最小值为15):java.util.Collection#stream 有人知道解决方案吗?[原始答案] 您不能在API级别pre.get(p)).collect(Collectors.toList()); } 其他的 { List col=new ArrayLis

我在这里读过。但我仍然无法在minSdkVersion<24上运行包含如下Java8流API特性的代码

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());
List newCars=cars.stream()
.filter(s->s.getColor().equals(“红色”))
.collect(Collectors.toList());
由于出现错误消息,此操作无法运行

调用需要API级别24(当前最小值为15):java.util.Collection#stream


有人知道解决方案吗?

[原始答案]

您不能在API级别<24的情况下使用Java8流

但是,有一些库支持某些流功能

(评论中提到@sartorius)

[更新k3b 2019-05-23]

是streamsupport的衍生产品,它利用了Android Studio 3.x D8/desugar工具链跨Jar文件边界使用界面默认和静态方法的能力。还有其他android ie的链接,以供将来使用

[更新aeracode 2020-07-24]

,现在我们可以使用Java 8 streams API和更多,而不需要最低的API级别。

因为8.2版也可以在Android设备上使用Java 8 streams API 此功能也将在不久的将来包含在ProGuard中,敬请期待


编辑:Proguard 6.1.0已经存在测试版,它支持对Java 8流和时间API进行后移植。

创建一个接口

public interface Pre<T,R> {
            R get(T item);
        }
公共接口预处理{
R-get(T项);
}
创建一个过滤器方法

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;
        }
    }
公共静态列表过滤器(列表,预处理){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N)
{
return list.stream().filter(p->pre.get(p)).collect(Collectors.toList());
}
其他的
{
List col=new ArrayList();
对于(int i=0;i
使用代码

    public static class model {
            public String Name;
        }
List<model> models = new ArrayList<>();
            ...
            List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
公共静态类模型{
公共字符串名称;
}
列表模型=新的ArrayList();
...
List filtermodels=Filter(模型,p->p.Name.equals(“Filter”);

参加聚会可能会晚一点,但我刚刚看到,如果我们使用
java8.util.stream.StreamSupport
,那么我们可以运行相同的函数式编程方法,并在Api 24之前使用它。Eg摘自web3j-

StreamSupport.stream(transactionReceipt.getLogs())
            .map(log -> extractEventParameters(event, log))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());

我喜欢使用的另一种解决方案是静态地使用Kotlin对Java代码集合的扩展,,当然,如果项目同时支持这两种方法的话:

List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));
List newCars=CollectionsKt.filter(cars,s->s.getColor().equals(“红色”);
同样适用于
.map
.reduce
。first
、…等

!从AGP4.0.0开始,我们可以使用流API和其他一些Java8+API(例如
Java.time

对应用程序的build.gradle所需的最小更改:


不,您不能使用api 24下面的java流。有第三方库实现了同样的功能,尽管workI有一个小型库,可以为较低的API做类似的事情:请参阅和,以获得类似的问题(和答案)。@pemapmoder您可以使用lambda表达式和方法引用,使用最早针对Android的新Jack编译器,可以追溯到Gingerbread。在SDK 24下,您不能使用默认/静态接口方法和Java 8特定的API,如Stream API。您可以在API 24下使用StreamSupport类,这对于流式编程来说无疑是很有价值的选项,因为它们中没有一个可以被远程视为Java 8 Stream API的“后端口”。我知道的唯一的项目可以声称是语法和在java 8流的功能上的标准。例如,它还支持并行流。虽然这对Android开发者来说可能不太重要,但轻量级流API在Android上是最好的,因为它支持Gradle,并添加了诸如“select”、“groupBy”等额外功能。@LordParsley streamsupport也支持Gradle。至于临时演员,没错。据我所知,从官方Java 8 API扩展/转移从来都不是streamsupport的设计目标。@Sartorius是对的–我建议查看Github镜像以了解使用详细信息,以及我读到的Gradle参考,一般来说Java流比集合慢。这些后台怎么样?它不是官方图书馆。我对图书馆本身并不了解,但我建议在用于商业项目之前检查一下图书馆的许可证。GNU通用公共许可证,版本2,类路径例外。可能需要一个层来确认。@MichalHarakal我花了几秒钟才意识到该层实际上是律师:)由于proguard的原因,我们的应用程序在发布版本中因去糖化而崩溃,你知道如何修复吗?这就是所谓的问题@AjahnCharles告诉人们,当他们的问题是关于语言A时,只使用语言B并不是一个好答案。许多项目仍然是用Java编写的。@AjahnCharles您在吸引读者注意Android生态系统可能发生的变化方面做得很好。也就是说,问题是关于Java的一个特定特性,Java仍然是Android开发的官方支持语言。切换,即使“仅”混合您的应用程序,也会带来成本(学习曲线,可能他们的团队不支持它,等等),这需要投入
android {
  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}