Lambda 更改可选<;可运行>;从内心深处

Lambda 更改可选<;可运行>;从内心深处,lambda,java-8,optional,Lambda,Java 8,Optional,我有一个变量oneTimeTask。其类型为: Optional<Runnable> oneTimeTask=...; 。。。你觉得怎么样 oneTimeTask将在应用程序运行时多次获取可选(someRunnable)值,但大多数情况下该值为空 我是否应该使用供应商或供应商? 如果是,您将如何实施?(我对供应商类不太熟悉) 我愿意使用任何其他(更好的)方法来实现相同的结果。看起来您正在将oneTimeTask定义为实例或静态字段(否则必须声明为final,才能从lambda访问)

我有一个变量
oneTimeTask
。其类型为:

Optional<Runnable> oneTimeTask=...;
。。。你觉得怎么样

oneTimeTask
将在应用程序运行时多次获取可选(someRunnable)值,但大多数情况下该值为空

我是否应该使用
供应商
供应商
? 如果是,您将如何实施?(我对供应商类不太熟悉)


我愿意使用任何其他(更好的)方法来实现相同的结果。

看起来您正在将
oneTimeTask
定义为实例或静态字段(否则必须声明为
final
,才能从lambda访问)

相反,您可以通过将字段保持为简单的
Runnable
,其初始值为no op,从而简化代码:

private Runnable oneTimeTask = () -> {};
在lambda中,完成后将其重置为无操作:

oneTimeTask = () ->  {
        /*Run task
        ...*/
        oneTimeTask= () -> {};
    };

现在,当您想要使用它时,您不必检查它是否为
null
,也不必处理
可选的
api。

看起来您正在将
oneTimeTask
定义为一个实例或静态字段(否则它必须声明为
final
,才能从lambda访问)

相反,您可以通过将字段保持为简单的
Runnable
,其初始值为no op,从而简化代码:

private Runnable oneTimeTask = () -> {};
在lambda中,完成后将其重置为无操作:

oneTimeTask = () ->  {
        /*Run task
        ...*/
        oneTimeTask= () -> {};
    };

现在,当您想要使用它时,您不必检查它是否为
null
,也不必处理
可选的
api。

因为您想要控制从一次调用返回到下一次调用的内容,您需要一个供应商

AtomicBoolean once = new AtomicBoolean();
Supplier<Runnable> oneTimeTask = () -> once.getAndSet(true) 
                                     ? () -> {} 
                                     : () -> { /* do one */ };

由于您希望控制从一个呼叫返回到下一个呼叫的内容,因此您需要一个供应商

AtomicBoolean once = new AtomicBoolean();
Supplier<Runnable> oneTimeTask = () -> once.getAndSet(true) 
                                     ? () -> {} 
                                     : () -> { /* do one */ };

“重置”是什么意思?是否要在runnable完成时将可选项设为空?如果是这样,您是如何运行runnable的(请将代码发布到您执行此操作的位置)?您的代码不会编译,因为
oneTimeTask
不是有效的最终版本(即,您将其分配给lambda中的其他内容)。您能否向我们展示您的用例,因为这个问题有点过于宽泛。您的应用程序是否有一部分生成这些一次性运行任务,另一部分运行这些任务?您所说的“重置”是什么意思?是否要在runnable完成时将可选项设为空?如果是这样,您是如何运行runnable的(请将代码发布到您执行此操作的位置)?您的代码不会编译,因为
oneTimeTask
不是有效的最终版本(即,您将其分配给lambda中的其他内容)。您能否向我们展示您的用例,因为这个问题有点过于宽泛。您的应用程序是否有一部分生成这些一次性运行任务,另一部分运行这些任务?代码是针对Android应用程序的。我正在使用一个“me.tatarka.retrolambda”插件,结果证明它并没有使lambda表达式像Java8中那样工作。谢谢你指出这一点。”“oneTimeTask”的用途不能是静态的。我可能会同意Peter Lawrey使用AtomicBoolean的想法——代码是用于Android应用程序的。我正在使用一个“me.tatarka.retrolambda”插件,结果证明它并没有使lambda表达式像Java8中那样工作。谢谢你指出这一点。”“oneTimeTask”的用途不能是静态的。我可能会同意Peter Lawrey使用AtomicBoolean的想法我的代码是为android编写的。我正在使用“me.tatarka.retrolambda”插件,它允许类似于Java8的lambda表达式与Android studio一起使用。但事实证明有一些区别,比如在Java8中,不可能像我在上面的问题中那样修改非静态变量。我的代码是为android编写的。我正在使用“me.tatarka.retrolambda”插件,它允许类似于Java8的lambda表达式与Android studio一起使用。但事实证明存在一些差异,比如在Java8中,不可能像我在上面的问题中那样修改非静态变量。