En utilisant java-8 maintenant j'ai tourné une déclaration explicite dans une expression lambda et ai obtenu une erreur de compilateur. Donc, je suppose qu'il s'agit d'un "bug" de la version actuelle de java-8 (b105).Java-8 lambda fonctionnelle vs expression explicite signale une erreur de compilateur
L'exemple de code définit deux objets Function avec et sans utiliser une expression lambda. Les deux relais sur un prédicat qui est utilisé par ces fonctions. Alors que la mise en œuvre traditionnelle fonctionne, la version lambda signale une erreur:
java: variable fileExists might not have been initialized
Ce n'est pas tout à fait tort, mais le prédicat est pertinent si la fonction est utilisée pas si la fonction elle-même est créée (depuis la version explicite fonctionne bien). Dois-je signaler un bug (quelqu'un a un lien?) Ou ai-je oublié quelque chose?
public class FileOpener {
public FileOpener(Predicate<File> fileExists) {
this.fileExists = fileExists;
}
final Predicate<File> fileExists;
final Function<File, FileInputStream> openLambda = file -> {
try {
return fileExists.test(file) ? new FileInputStream(file) : null;
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
};
// this version compiles
final Function<File, FileInputStream> openFunction = new Function<File, FileInputStream>() {
@Override
public FileInputStream apply(File file) {
try {
return fileExists.test(file) ? new FileInputStream(file) : null;
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
};
}
Avant de signaler un bug je (a) passer à la dernière version et (b) demander sur la liste de diffusion dédiée, peut-être celui-ci: http://mail.openjdk.java.net/mailman/listinfo/jdk8-dev Le comportement pour le lambda semble raisonnable car c'est un lambda capturant et il a probablement besoin de connaître sa valeur de paramètre quand elle est construite. – assylias
Et où 'fileExists' est-il initialisé? Les champs ne sont-ils pas initialisés avant le constructeur? –
@assylias: "capturer" s'applique uniquement aux variables locales. Comme ce n'est pas dans une méthode, il n'y a pas de variables locales. – newacct