Теперь, используя java-8, я превратил явное объявление в лямбда-выражение и получил ошибку компилятора. Так что подозревайте, что это «ошибка» текущей версии java-8 (b105).
Пример кода определяет два объекта Function с использованием лямбда-выражения и без него. Оба ретранслируют предикат, который используется этими функциями. В то время как традиционная реализация работает, лямбда-версия сообщает об ошибке:
Java: переменная fileExists могла быть не инициализирована
Это не совсем неправильно, но предикат актуален, если функция используется, а не если сама функция создается (поскольку явная версия работает хорошо). Должен ли я сообщить об ошибке (у кого-то есть ссылка?) или я что-то пропустил?
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);
}
}
};
}
fileExists? Разве поля не инициализируются до конструктора? - person Edwin Dalorzo   schedule 16.10.2013openLambdaявляется полем экземпляра, поэтому во время создания объекта оно оценивается ДО конструктора, поэтомуfileExistsв этот момент не инициализируется. - person Edwin Dalorzo   schedule 16.10.2013fileExistsне инициализируется при инициализацииopenLambda. - person newacct   schedule 16.10.2013