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中,不可能像我在上面的问题中那样修改非静态变量。