LINUX.ORG.RU

Java SE 8

 ,


0

4

Oracle анонсировал выпуск новой версии Java SE — 8.

В эту версию вошел ряд значительных изменений, в том числе:

  • В язык Java добавлена поддержка лямбда-функций. Разработчикам языка удалось добавить замыкания в язык таким образом, что их можно применять в большом количестве API, разработанных для предыдущих версий языка.
  • Stream API. В стандартную библиотеку коллекций были добавлены функции filter/map/reduce/т.п., позволяющие производить обработку и преобразование коллекций в функциональном стиле. Также были добавлены коллекции с автоматическим распараллеливанием операций преобразования с использованием Fork/Join Pool.
  • Nashorn — новый эффективный интерпретатор JavaScript.
  • Date & Time API — новое API для работы с датами и календарем, построенное на идеях популярной библиотеки Joda Time.

Коммерческая версия Oracle JDK построена на базе opensource реализации OpenJDK и содержит некоторое количество дополнений (наиболее значительное — Mission Control, средство для сбора анализа статистики работы JVM).

>>> Подробности

★★★★★

Ответ на: комментарий от vitalikp

Например, логирование осталось там где было. Хотя мне это не мешает.

slf4j решает задачи логирования удобным образом. Если нужно что-то еще, то log4j / logback / Java logging в помощь.

Хотя реально нужных изменений нету.

На уровне языка и платформы самые вкусные изменения - лямбда и модульность. Лямбду сделали, модульность к сожалению все пилят.

Еще бы хорошо дженерики доделать, но скорее всего будут проблемы с обратной совместимостью, потому вероятно дженерики будут reified всегда.

VoDA ★★ ()
Ответ на: комментарий от soslow

Ну а кто на лямбды повелся, сидит и кушает local variables referenced from a lambda expression must be ‘effectively final’, ха-ха.

И в чем проблема?

Java защищает от «кривого» программирования. В данном случае это из за того, что лямбды могут в параллельных потоках работать. И чтобы избежать ситуации race-condition была сделана защита в виде final. Вполне себе хорошее решение.

VoDA ★★ ()

я так понимаю что определить такую штуку нельзя:

int a = func (3, 4, +);

?

надо через интерфейс add = (a, b) -> a + b;

и только потом

int a = add (3, 4);

Rastafarra ★★★★ ()
Ответ на: комментарий от anonymous

yoghurt

Fake.java:

interface FakeAndGay {
    void doNothing();
}

public class Fake {
    public static void main(String[] args) {
        int x = 0;
        FakeAndGay fng = () -> x++;
    }
}

javac Fake.java

Fake.java:8: error: local variables referenced from a lambda expression must be final or effectively final
        FakeAndGay fng = () -> x++;
                               ^
1 error

java -version
java version "1.8.0"
soslow ()
Ответ на: комментарий от yoghurt

Нет, нельзя, ведь «лямбда» и есть обертка анонимного класса.

soslow ()
Ответ на: комментарий от soslow

error: local variables referenced from a lambda expression must be final or effectively final

Жалко, что в скале такого нет.

int x = 0;
FakeAndGay fng = () -> x++;

Эталонный быдлокод. Увольнял бы с последующим расстрелом. man fold и man reduce.

shahid ★★★★★ ()
Ответ на: комментарий от yoghurt

Это-то я понял, а из анонимного класса-то нельзя локальные переменные захватить?

Напрямую нельзя. Но есть варианты :)

Сделай final int[] x = new int[1]; и использование () -> x[0] = 5;

По большому счету локальные переменные менять из лямбды - плохо, но если совсем приспичило, то можно выкрутиться ;)

VoDA ★★ ()

Интересно, как быстро смогут сделать интерфейс для работы с СУБД на основе лямбд (аналог Linq).

VoDA ★★ ()

Использую восьмерку в проекте уже месяца полтора, действительно удобно. Стримы с лямбдами в некоторых местах позволяют довольно ощутимо снизить количество кода.

Nagwal ★★★★ ()
Ответ на: комментарий от comp00

В тильде наверняка есть уже. Она вроде вместе с сайтом обновляется.

Deleted ()

лямбда-функции
Stream API

От треска пердаков лиспохацкелистов начинает закладывать уши.

Баттхёрта-маргинальщиков-тред, иди!

anonymous ()
Ответ на: комментарий от soslow

Т.н. «лямбды», которые обещали несколько лет, но так и не осилили — всего лишь обертки вокруг анонимных классов, синтаксический сахарок. Ну а замыканий нет и не будет, например.

4.2

It’s fascinating to see how Java, the most “strict” of modern languages is now using dynamic linkage to power its new Lambda expressions. It’s also an efficient approach, as no additional class loading and compilation is needed – the Lambda method is simply another private method in our class.

http://www.takipiblog.com/2014/01/16/compiling-lambda-expressions-scala-vs-ja...

local variables referenced from a lambda expression must be ‘effectively final

Давно пишу код без переменных. Допустим на скале было бы такое же сообщение, то я о нём никогда бы и не узнал. ЧЯДНТ?

shahid ★★★★★ ()
Ответ на: комментарий от VoDA

прелесть Linq не в наличии Linq-to-sql, а в том, что AST полученный из Linq-expression можно анализировать средствами самой программы, и таким образом относительно легко добавлять новые синтаксисы

а linq-to-sql-подобных библиотек для жабы гуглится сразу несколько штук, но из-за отсутствия вышеописанных функций они все работают на основе генерации кода, т.е. являются полным отстоем

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

разве в интерфейсах нельзя писать реализаций методов?

В трейтах — можно. В интерфейсах — нет, потому что интерфейсы. Но в java нет трейтов.

shahid ★★★★★ ()
Ответ на: комментарий от shahid

В трейтах — можно. В интерфейсах — нет, потому что интерфейсы. Но в java нет трейтов.

И конечно же ты жутко, отягчающе не прав.

Четай: http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/

tl;dr: помечаем метод в интерфейсе как default, и пишем ему реализацию прямо как в обычном классе

stevejobs ★★★★☆ ()
Ответ на: комментарий от stevejobs

Трейт - это намного больше, чем интерфейс с реализованным методом, хотя внешне он выглядит именно так. В java мощи трейтов нет. Курим scala stackable trait pattern, trait abstract override и т.д.

Ручной резолв конфликтов default-методов по ссылке доставляет отдельно. PS: Насчет реализации в интефейсах — да, неправ.

shahid ★★★★★ ()
Последнее исправление: shahid (всего исправлений: 1)
Ответ на: комментарий от shahid

Так я на скале и пишу. Вот раздумываю, стоит ли начать рассматривать яву как язык, после введения этих фишек из восьмерки.

Хотя, изначально на скалу подсел из-за отсутствия проклятых NullPointerExceptions и паттерн-матчинга, и не похоже что новая явка сильно поможет в этом.

stevejobs ★★★★☆ ()

Java SE 8

Что там с Sumatra и OpenCL/HSA?

devl547 ★★★★★ ()

В язык Java добавлена поддержка лямбда-функций

Блин. Секта K&R, похоже, осталась в гордом одиночестве.

unsigned ★★★ ()
Ответ на: комментарий от anonymous

замыкания с постоянным состоянием - достаточно полезные для целевой аудитории ползователей Java-языка , поэтому утверждение что разработчики Java-языка правы утверждая , что им удалость добавить замыкания.

зы. семантика замечательная забава.

qulinxao ★★☆ ()
Ответ на: комментарий от VoDA

из лямбды не осторожно менять переменые которые оказались доступные по разным путям (из лямбды и из исходного окружения в котором осталось указание на захваченое лямбдой)

если же только лямбда владеет состоянением(которое читает и если надо меняет) - то это и есть годное замыкание без вопросов и уточнений.

зы. трудно быдь адвокатом маркетологов среди квалифицированых:) программистов.

qulinxao ★★☆ ()
Ответ на: комментарий от qulinxao

однако в этом случае замыкания ограничины константными состояними не так ли?

не совсем - замыкание позволяет работать со свойствами объекта, и локальными переменными. поскольку замыкание потенциально связывает разные потоки (поток функции и поток лямбды), то сделана защита локальных переменных от race-condition.

Если нужно обойти защиту ЛОКАЛЬНЫХ переменных функции, то стоит проверить а нет ли нарушения тех или иных подходов и best practices. По простому - а не «овнокод» ли требует доступа к локальным переменным. Скорее всего есть грамотный путь - streaming API / reduce / etc.

PS лямдбы - реализация функционального подхода. а ФП не всегда имеет состояние. Чаще stateless.

VoDA ★★ ()
Ответ на: комментарий от Den_Zurin

где это он прямо так вот утверждал/утверждает?

ежель он в Обероне вполне приемлет сборку мусора

ну а стековоя организация функций(включая возможность вложенности функций унаследованая из Паскаля унаследованая из Алгола ) в сочетании со сборкой мусора и выделением локальной памяти не через стек , а через хип(т.е возможность возврата памяти системе не только через FILO а как угодно) автоматом приводит к замыканиям.

qulinxao ★★☆ ()
Ответ на: комментарий от soslow

Понятно, то есть лямбды осилили, а замыкания нет.

Но хоть сахарок, чем по 5 строк писать на каждую лямбду...

vitalif ★★★★★ ()
Ответ на: комментарий от ZenitharChampion

ну ты умный.... Процессор обнови, ну или хотябы подожди пока Ноч обновит код до 8ки, там посмотрим что будет)

ii8_ ★★★★ ()
Ответ на: комментарий от soslow

а через косвенность это решается?

или и разименованная сущность тоже обязана быть 'effectively final' ?

qulinxao ★★☆ ()
Ответ на: комментарий от stevejobs

Ну, с паттерн-матчингом да, не особо. А вот Optional в stream api вполне себе появился, что частично от npe избавляет.

Nagwal ★★★★ ()

Очень круто!
Жаль только, что на работе еще только шестая версия используется :(

kovrik ★★★★★ ()
Ответ на: комментарий от VoDA

slf4j решает задачи логирования удобным образом. Если нужно что-то еще, то log4j / logback / Java logging в помощь.

Вы наверное не в теме, раз так рассуждаете. Речь не об этом. А о нормальной поддержки API логирования на уровне Java. То что есть сейчас назвать жалким подобием, язык не поворачивается. А библиотеки есть, не спорю. На любой вкус и цвет.

На уровне языка и платформы самые вкусные изменения - лямбда и модульность.

Никогда не страдал подобное фигней. Не считаю это чем-то важным.

Лямбду сделали, модульность к сожалению все пилят.

То есть без модульности никак? Скажу более это то, без чего можно обойтись.

vitalikp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.