当前位置: 首页 > 知识库问答 >
问题:

有没有办法在24以下的Android API上使用Java8个功能接口?

司空学智
2023-03-14

我可以使用retrolambda启用具有Android API级别的lambdas

myButton.setOnClickListener(view -> Timber.d("Lambdas work!"));

这同样有效

Runnable runLater = () -> Timber.d("Lambdas work!");
runLater.run();

但这个不行

Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i);
runLaterWithInt.accept(3);

最后一个适用于Android API Level 24,但在其他设备上此代码会导致崩溃

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda$1

我尝试启用Java8.前两个代码示例仍然可以工作,尽管Butter停止了工作。https://developer.android.com/preview/j8-jack.html#configuration这里ava.util.function据说是支持的,但是我在运行第三个时仍然会崩溃,这次有点不同

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1

共有3个答案

充普松
2023-03-14

作为替代方案,轻量级流API还提供了后端口支持。像上面提到的android retrostreams一样,您必须使用以下代码替换一些包名:com。安尼蒙。流动函数,而不是java。util。功能。安尼蒙。流动ComparatorCompat而不是java。util。比较器

施德运
2023-03-14

Android支持库(AndroidX)现在有消费者和供应商:

  • androidx.core.util.消费者(出现在androidx.appcompat: appcompat: 1.0.2
  • androidx.core.util.供应商(出现在androidx.appcompat: appcompat: 1.1.0-alpha01

遗憾的是,在编写时只添加了这两个接口。

现在我们有了静态编程语言,它不需要您显式指定函数接口:

    fun test() {
        val text = withPrintStream {
            it.println("Header bla bla ")
            it.printf("%s, %s, %s,", "a", "b", "c").println()
        }
    }

    // Equivalent to the following code in Java:
    //     Consumer<PrintStream> action;
    //     action.accept(ps);
    fun withPrintStream(action: (PrintStream) -> Unit): String {
        val byteArrayOutputStream = ByteArrayOutputStream()
        val ps = PrintStream(byteArrayOutputStream)
        action(ps)
        ps.flush()
        return byteArrayOutputStream.toString()
    }
易招
2023-03-14

不确定你是否还需要这个问题的答案,但其他人(比如我自己)可能需要。

作为3.0版本,Android Studio在所有API级别上原生支持lambda函数和许多其他Java8函数,但其中一些(如功能接口java.util.function)仍然仅限于API 24。

在这种支持得到扩展之前,android-逆向流为大部分提供反向端口支持。这个项目是流支持库的“升级端口”,您也可以使用它,并且具有android-逆向流中的许多功能。流支持库支持低至Java6/7,因此即使您没有AS 3.0或不针对Java8,您也可以使用它,但如果可以的话,在大多数情况下使用android-逆向流可能会更好。您可以浏览项目的javadocs以查看提供的确切内容,但我使用的亮点是java.util.functionjava.util.比较器

请注意,包名称中的java被替换为java9,并且一些类和/或方法名称可能略有更改。例如:

<代码>java。util。函数变为java9。util。功能,

<代码>java。util。比较器变为java9。util。比较器(方法名称和调用模式略有不同,但功能相同)。

 类似资料:
  • 我使用的界面看起来大致如下: 并且我目前正在使用一个匿名类来实现接口,但我并不关心这两种方法中的一种。大致如下: 现在,我已经在Java8中尽可能地使用新的lambda表达式,我想在这种情况下使用增加的简单性。毕竟,我只是在实现其中的一个方法,但由于接口中有两个方法,所以我不能在一个lambda表达式中使用它。

  • 问题内容: 使用方法是否有获取功能的方法?使用实际表单元格时可以使用该方法吗? 特别是我需要一些“单元格”来跨越多列。 真实表是不可能的,因为我在 每行 布局中使用 表单 ,因此无法作为真实表进行验证。 问题答案: 不,您不能将colspan或rowpan添加到display:table-cell。这是表格单元功能的限制之一! 您可以在此参考链接中查看限制 如果要将COLSPAN功能引入表单元,则

  • 问题内容: 我可以使用retrolambda启用Android API级别<24的lambda。所以这有效 这也有效 但是这个不 最后一个适用于Android API Level 24,但此代码在其他设备上会导致崩溃 我没有使用Retrolambda而是尝试启用Java8。尽管前者已停止运行,但前两个代码示例仍然有效。据说这里支持https://developer.android.com/prev

  • 所以我想要一个“Void Repository”,通过它可以访问不一定在实体上操作的存储过程。 但这当然不起作用,因为期望是一个实体。 有没有一种方法可以使用注释而无需创建虚拟实体,或者我是否坚持使用使用通过准备好的语句进行查询的已实现类? 因为老实说,这很难看:

  • 我想使用并使其直接进入给定的url,而不是从ribbon配置中获取主机。 我知道在Spring,cloud-feign默认与ribbon和eureka一起出现。 根据这个:https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-ribbon.html#spring-cloud-ribbon-without-eure

  • 问题内容: 我想在Python中使用PhantomJS。我用谷歌搜索了这个问题,但是找不到合适的解决方案。 我发现 可能是一个不错的选择。但是我无法通过一些争论。 使用可能是目前合适的解决方案。我想知道是否有更好的解决方案。 有没有办法在Python中使用PhantomJS? 问题答案: 在python中使用PhantomJS的最简单方法是通过Selenium。最简单的安装方法是 安装NodeJS