Статьи

8 новых функций для Java 8

ПРИМЕЧАНИЕ. Обязательно ознакомьтесь с нашим подробным учебным пособием по функциям 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