是否可以使方法只执行一次?

我有一个for循环和这样的结构:

for(....) .... .... if(isTrue) ... do something.. .. method to be executed once (doTrick) is declared outside for loop. ....endif endfor public void doTrick() ... ... ..end 

for循环中的方法只能执行一次吗?

当然!..

 if(!alreadyExecuted) { doTrick(); alreadyExecuted = true; } 

您可以使用AtomicBoolean确保仅在第一次调用该任务时:

 public class Once { private AtomicBoolean done = new AtomicBoolean(); public void run(Runnable task) { if (done.get()) return; if (done.compareAndSet(false, true)) { task.run(); } } } 

用法:

 Once once = new Once(); once.run(new Runnable() { @Override public void run() { foo(); } }); // or java 8 once.run(() -> foo()); 

你可以通过使用这个技巧来避免if()

 private Runnable once; private final static Runnable NOP = new Runnable () { public void run () { // Do nothing } } public void method () { once = new Runnable () { public void run () { doTrick(); once = NOP; } } for (...) { ... once.run(); ... } } 

也许break关键字是你需要的? 运行方法后调用break; 对不起,我不清楚你的问题是什么意思。

从太阳文档看看这里

另一个过度杀伤解决方案:

根据您的要求,可以使用静态初始化块。

 public class YourKlass{ public void yourMethod(){ DoTrick trick; for( int i = 0; condition; i++){ // ... (1) trick = new DoTrick(); // or any kind of accessing DoTrick // ... (2) } } } public class DoTrick{ static{ // Whatever should be executed only once } } 

简单解决方案

或者,您只想执行循环外的第一部分:

 int i = 0; if( condition ){ // ... (1) // do trick // ... (2) } for(i = 1; condition; i++){ // ... (1) // ... (2) } 

在Java 8中,您可以使用自动memoization有效地执行此操作,如下所述: 在Java 8中执行此操作:自动记忆

我承认,对于“一次运行”场景,可能会将备忘录视为过度杀戮,但它是以前答案中描述的一些相当干净的替代方案。

例如:

 public void doSomething() { ... } Map cache = new ConcurrentHashMap<>(); public void doSomethingOnce() { cache.computeIfAbsent(true, x -> { doSomething(); return true; }); } 
 import java.util.ArrayList; class RemoveDuplicate { public static void main(String[] args) { ArrayList originalList = new ArrayList(); originalList.add("foo"); originalList.add("bar"); originalList.add("bat"); originalList.add("baz"); originalList.add("bar"); originalList.add("bar"); String str="bar"; ArrayList duplicateList = new ArrayList(); // adding duplicates to duplicateList for(String currentString : originalList) { if(currentString.startsWith(str)) { duplicateList.add(currentString); } } // removing duplicates in duplicatesList for(String removeString : duplicateList) { originalList.remove(removeString); } // finally adding duplicateElement originalList.add(str); for(String currEntry : originalList) { System.out.println(currEntry); } } } 

我的应用程序中的示例:

 boolean alreadyExecuted = false; 

然后 :

 private void startMyService() { if(!alreadyExecuted) { final Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { //Do something after 4 seconds context.startService(new Intent(context, myService.class)); alreadyExecuted = true; } }, 4000); }