Jdk 8 В Примерах

Брайан Гетц недавно написал в блоге 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

Вместе с данным постом часто просматривают: