2013-02-04 2 views
0

Comment convertir l'exemple JavaScript ci-dessous en code correspondant dans Java 8 avec lambda. J'essaie d'obtenir le Java 8 lambda.
Exemple inventé. J'ai essayé d'écrire en Java 8, mais la syntaxe ou quelque chose ne va pas. Voir le code ci-dessous.Comment écrire une invocation de fonction immédiate en Java? Exemple JavaScript fourni

// 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 

Merci.

+0

La réponse de Stuart Marks est la meilleure traduction littérale de ce JavaScript en Java 8, mais je Je ne comprends pas pourquoi tu voudrais faire ça. La raison pour laquelle les gens utilisent habituellement les IIFE en JavaScript est que la langue n'a pas la bonne portée lexicale, ce que Java a. –

+1

"Je ne comprends pas pourquoi tu voudrais faire ça": Rien de particulier, je voulais juste savoir si c'est possible. – boring

Répondre

1

Je ne suis pas programmeur java mais il semble que quelque chose comme ça faire l'affaire:

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

C'est génial! – boring

3

Vous devez fournir un « type de cible » pour le lambda à convertir en une instance d'une interface fonctionnelle. Si vous ne voulez pas déclarer une variable de ce type spécifique, un casting fera l'affaire. Ensuite, vous appelez la méthode de l'interface fonctionnelle. Dans ce cas, je recommanderais Supplier, qui ne prend aucun argument et retourne le type T. La méthode abstraite de Supplier est get() alors c'est ce que vous appelez.

Essayez ceci:

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(); 
    } 
} 

(Testée avec accès rapide JDK8 construire 73, à partir de la mi-janvier 2013.)

Questions connexes