2013-02-04 26 views
0

如何使用lambda將以下JavaScript示例轉換爲Java 8中的相應代碼。我正在嘗試獲得Java 8 lambda。
編寫示例。如何在Java中編寫立即函數調用?提供的JavaScript示例

// js 
var isFlag = true, 
    name = (function() { 
     if (isFlag) return "A"; 
     else return "B"; 
    })(); 
console.log(name); 

//outputs: A 

我已經嘗試在Java 8中編寫它,但是語法或者某些東西是錯誤的。請參閱下面的代碼。

// LambdaTest.java 
class LambdaTest { 
    public LambdaTest() { 
     boolean isFlag = true; 
     String name =() -> { //I know this is wrong. It is not an IIFE. But how to write one? 
      if (isFlag) return "A"; 
      else return "B"; 
     }; 
     System.out.println(name); 
    } 
    public static void main(String... args) { 
     LambdaTest lt = new LambdaTest(); 
    } 
} 

// outputs: 
// LambdaTest.java:4: error: incompatible types: String is not a functional interface 
//  String name =() -> { 
//     ^
// 1 error 

謝謝。

+0

斯圖爾特·馬克斯的答案是這樣的JavaScript的最好的字面翻譯成Java 8,但我不明白你爲什麼想這樣做。人們通常在JavaScript中使用IIFE的原因是因爲該語言缺乏恰當的詞彙範圍界定,這是Java所具有的。 –

+1

「我不明白你爲什麼要這麼做」:沒有什麼特別的,只是想知道是否有可能。 – boring

回答

1

我不是Java程序員,但似乎這樣的事情做的伎倆:

import java.util.concurrent.Callable; 
import java.lang.String; 

class LambdaTest { 
    public LambdaTest() { 
     boolean isFlag = true; 
     Callable<String> name =() -> { 
      if (isFlag) return "A"; 
      else return "B"; 
     }; 
     try { 
      System.out.println(name.call()); 
     } catch (Exception e) { 
      //cause call can throw exception so we need to handle that 
     } 
    } 
    public static void main(String... args) { 
     LambdaTest lt = new LambdaTest(); 
    } 
} 
+0

太棒了! – boring

3

你必須提供一個「目標類型」爲拉姆達被轉換成一個功能界面的一個實例。如果你不想聲明這個特定類型的變量,那麼演員將會執行這個技巧。然後,您調用功能接口的方法。在這種情況下,我建議使用Supplier,它不帶參數並返回類型T. Supplier的抽象方法是get(),這就是您所說的。

試試這個:

import java.util.function.Supplier; 

class LambdaTest { 
    public LambdaTest() { 
     boolean isFlag = true; 
     String name = ((Supplier<String>)() -> { 
      if (isFlag) return "A"; 
      else return "B"; 
     }).get(); 
     System.out.println(name); 
    } 
    public static void main(String... args) { 
     LambdaTest lt = new LambdaTest(); 
    } 
} 

(測試用JDK8早日進入建設73,從1月中旬2013年)

相關問題