Брайан Гетц недавно написал в блоге Oracle связь для презентации с докладом Devoxx о коэволюции языка/библиотеки/VM в Java SE 8. В этой статье я попытаюсь кратко раскрыть основные проблемы, которые будут решены в восьмерке, а также пути их решения, которые выбрал Oracle. Остальные аспекты можно посмотреть в оригинале.
Читай дальше: Расширение существующих API с обратной совместимостью; Java становится еще более объектно-ориентированной; Лямбда-выражения в Java; Упрощение многопоточности.
Итак, что Oracle хочет сделать:
I. Расширение существующих API с помощью обратной совместимости.
Чтобы облегчить жизнь всем Javaистам, было решено расширить/дополнить JDK, а также дать всем (включая существующие фреймворки) возможность дополнять свои API. В этом случае обязательным условием является сохранение функциональности устаревшего кода.
Для этого ребята из Oracle сделали методы виртуального расширения.
Методы виртуального расширения — это методы, которые можно добавлять к существующим интерфейсам и обеспечивать реализацию этих методов по умолчанию, при этом реализующие классы не потребуют перекомпиляции и будут работать так же, как и раньше.
Мы получаем сохранение функционала существующих API с одной стороны и возможность расширения функционала с другой.
Пример — Iterator и UnsupportedOperationException.
Мы все знаем метод удаления интерфейса Iterator. В javadoc говорится, что если реализация итератора не поддерживает метод удаления, она может выдать исключение UnsupportedOperationException. Согласитесь, это криво.
Если я не собираюсь реализовывать метод, то зачем мне его определять и выдавать исключение?
Решение:
Это определяет реализацию по умолчанию для метода удаления.interface Iterator<T> { boolean hasNext(); T next(); void remove() default { throw new UnsupportedOperationException(); }; }
Теперь реализующие классы не обязаны обеспечивать реализацию этого метода.
Примером является итерация по списку.
Допустим, есть код, определяющий высший балл среди студентов за 2011 год:
List<Student> students = .
double highestScore = 0.0;
for (Student s: students) {
if (s.getGradYear() == 2011) {
if (s.getScore() > highestScore) {
highestScore = s.score;
}
}
}
На первый взгляд, это довольно сносный код. Но он не объектно-ориентирован.
Фактическая итерация по списку происходит в цикле for в клиентском коде, использующем список.
Вы можете добавлять в коллекции виртуальные методы и переписывать этот код, используя объектно-ориентированный подход и «внутреннюю» итерацию.
SomeCoolList<Student> students = .
double highestScore = students.filter(new Predicate<Student>() { public boolean op(Student s) { return s.getGradYear() == 2011; } }).
map(new Mapper<Student, Double>() { public Double extract(Student s) { return s.getScore(); } }).
max();
Здесь итерацию уже выполняет класс SomeCoolList. Но согласитесь, это очень громоздко и многословно.
И здесь на помощь приходит лямбда-выражение.
Решение:
SomeCoolList<Student> students = .
double highestScore =
students.filter(Student s -> s.getGradYear() == 2011)
.
map(Student s -> s.getScore())
.
max();
У этого подхода есть еще одно преимущество — проще распараллелить выполнение, поскольку по коллекции проходит сама коллекция.
II. Упрощение многопоточности
Поскольку компьютеры с многоядерными процессорами сейчас стали нормой, очевидно, что имеет смысл использовать эти самые ядра, т.е.писать многопоточные программы.
Поэтому следующим улучшением в JDK 8 является упрощение параллелизма.
Приведенный выше код, использующий только методы многопоточности и виртуального расширения, можно переписать следующим образом:
SomeCoolList<Student> students = .
double highestScore = students.parallel() .
filter(Student s -> s.getGradYear() == 2011) .
map(Student s -> s.getScore()) .
max();
На этом основные основные особенности восьмерки заканчиваются.
Напоминаю также, что вы можете скачать JDK Standard Edition 8 Developer Preview с поддержкой Lambda. Здесь .
Теги: #java #jdk 8 #oracle #java
-
Скоро Выйдет Ubuntu 7.10 (Gutsy Gibbon).
19 Oct, 24 -
Skypein В России
19 Oct, 24 -
Игрок В Бейсболке
19 Oct, 24