2013-02-04 25 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年)

相关问题