ПРИМЕЧАНИЕ. Обязательно ознакомьтесь с нашим подробным учебным пособием по функциям Java 8 — Руководство по ULTIMATE .
Jdk 1.8, иначе говоря, Java 8 запущена сегодня, что означает, что ее версия General Availability уже открыта, и разработчики могут перейти с ранних выпусков на протестированный выпуск для производственного использования. Но что это значит для вас, занятого Java-разработчика? Ну, вот некоторые моменты, которые я сжал, чтобы отметить этот выпуск:
1. Лямда Выражения
Я начал с лямбда-выражений, поскольку это, пожалуй, самая востребованная функция в языке после, возможно, Generics / Annotations в Java 5.
Вот синтаксис:
1
|
(argtype arg...) -> { return some expression.. probably using these arguments } |
Что он делает, так это уменьшает код там, где это очевидно, например, в анонимном внутреннем классе. (Обработчики Swing Action только что стали сексуальными, ууу!)
Таким образом, поток может быть изменен как:
1
2
3
4
5
6
7
8
|
Runnable oldRunner = new Runnable(){ public void run(){ System.out.println( "I am running" ); } }; Runnable java8Runner = () ->{ System.out.println( "I am running" ); }; |
Как и в Scala, вывод типов также возможен в Lambdas. Рассмотрим следующий доступный пример:
1
|
Comparator c = (a, b) -> Integer.compare(a.length(), b.length()); |
Здесь типы a, b (в данном случае String из интерфейса Comparator) выводятся по мере реализации метода сравнения.
Символ, используемый для отделения блока от аргументов, -> очень похож на =>, уже использованный в Scala, и если вы хорошо разбираетесь в этом, нет особой причины для переключения, так как вы почувствуете, что реализация лямбда-выражений в java неадекватна (и многословно), но для хорошего программиста Java, это путь.
2. Общие изменения и улучшения типа
Используя подсказки Lambdas, общие коллекции также могут определять типы данных, которые будут использоваться в определенной степени. Например, методы, использующие универсальную коллекцию, не обязательно должны указывать родовые типы. Следовательно, следующий метод
1
|
SomeClass.method(); |
Можно вызвать просто игнорируя информацию о типе:
1
|
SomeClass.method(); |
Тип может быть выведен из сигнатуры метода, которая полезна во вложенных вызовах, таких как
1
|
myCollection. sort ().removeUseless().beautify(); |
3. Типы коллекций потоков ( java.util.stream )
Поток — это итератор, который позволяет один раз запустить коллекцию, к которой он обращен. Наряду с лямбдами, это еще одна заслуживающая внимания особенность, на которую стоит обратить внимание. Вы можете использовать потоки для выполнения функциональных операций, таких как filer или map / сокращения над коллекциями, которые могут быть переданы в виде отдельных элементов с использованием объектов Stream. Потоки могут работать последовательно или параллельно по желанию. Параллельный режим использует инфраструктуру fork / join и может использовать мощность нескольких ядер.
Пример:
1
|
List guys = list.getStream.collect(Collectors.toList()) |
также может быть реализован параллельно как
1
|
List guys = list.getStream.parallel().collect(Collectors.toList() |
Еще один хороший пример, который сводит коллекцию к одному элементу, — это вызов метода Algorithem.
1
|
int sum = numberList.stream().reduce(0, (x, y) -> x+y); |
или же,
1
|
int sum = numberList.stream().reduce(0, Integer:: sum ); |
4. Функциональные интерфейсы ( java.util.function )
Эти интерфейсы содержат некоторые методы по умолчанию, которые не нужно реализовывать и могут запускаться непосредственно из интерфейса. Это помогает в существующем коде — изменяющие интерфейсы не должны заставлять все классы, реализующие его, реализовывать новые методы. Это похоже на черты в Scala, и функциональные интерфейсы будут совместимы с лямбдами.
5. Нашорн — Node.js на JVM
Это движок javascript, который позволяет нам запускать javascript для работы на jvm. Это похоже на двигатель V8, предоставляемый Chrome, по которому работает Node.js. Он совместим с приложениями Node.js, а также позволяет вызывать реальные библиотеки Java с помощью кода javascript, работающего на сервере. По крайней мере, это интересно, поскольку объединяет масштабируемость и асинхронный характер Node.js с безопасным и широко распространенным промежуточным ПО Java на стороне сервера.
6. Дата / Время изменения ( java.time )
http://download.java.net/jdk8/docs/api/java/time/package-summary.html
API Date / Time перенесен в пакет java.time, после чего используется формат времени Joda. Другим плюсом является то, что большинство классов являются Threadsafe и неизменяемыми.
7. Тип аннотации
Теперь аннотации могут быть использованы для оформления общих типов.
Например:
1
|
List<@Nullable String> |
что не всегда желательно, но может оказаться полезным в определенных обстоятельствах. Помимо украшения общих типов, он также может быть использован в конструкторах и приведениях.
1
2
3
4
|
new @NonEmpty @Readonly List(myNonEmptyStringSet) new @Interned MyObject() myString = (@NonNull String) myObject; |
Даже объекты массива могут быть аннотированы:
1
|
@NotNull String[] arr; |
Включение атрибутов RuntimeVisibleTypeAnnotations и RuntimeInvisibleTypeAnnotations, которые заставляют файл .class сохранять информацию аннотации.
8.Другие — (приятно иметь) Изменения
Отражение API немного увеличено с поддержкой TypeName, GenericString и т. Д.
Метод String.join () является долгожданным дополнением, поскольку вместо него создается множество самостоятельно созданных служебных классов. Итак, следующий пример
1
|
String abc= String. join ( " " , "Java" , "8" ); |
Будет оцениваться как «Java 8».
В пакете «Коллекции» обновлен интерфейс Comparator и добавлены такие методы, как «полностью измененный», «сравнение» и «сравнение», которые позволяют легко настраивать сравнение по нескольким полям. Другие библиотеки, такие как Concurrency и NIO, также были обновлены, но ничто не заслуживает внимания для отслеживания и соответствует изменениям в API.
В целом, Java8 хорошо продумана и делает основной java лаконичным и выбирает некоторые хорошие части Scala / Clojure для улучшения его синтаксиса и решения многих востребованных функций.
Ссылка: | 8 новых функций для Java 8 от нашего партнера JCG |