Теперь, используя 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);
}
}
};
}