是否可以在Android API上使用Java 8流API<;24?
我在这里读过。但我仍然无法在minSdkVersion<24上运行包含如下Java8流API特性的代码是否可以在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
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 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'
}