Лямбды, лямбды, лямбды. Это все, о чем вы слышите, когда говорят о Java 8. Но это всего лишь одна часть. Java 8 имеет множество новых возможностей - некоторые мощные новые классы и идиомы, а другие всего лишь вещи, которые должны были быть с самого начала.
Я хотел перейти к десяти новым возможностям, которые я рассматриваю как маленькие драгоценные камни, определенно стоящие того, чтобы их знали. Среди них обязаны быть хотя бы один или два, которые вы бы хотели попробовать, поэтому давайте начнем!
1) Методы по умолчанию.
Нововведение в языке Java, теперь вы можете добавлять тела методов в интерфейсы (методы по умолчанию). Эти методы безоговорочно добавляются во все классы, реализующие эти интерфейсы.
Это дает вам возможность добавлять новый функционал в существующие библиотеки, не испортив старый код. Это определенно плюс. С другой стороны, это серьезно размывает границу между интерфейсом, обязывающим следовать определенным условиям в качестве соглашения, и классом, который им следует в качестве его частной реализации. В (прямых) правильных руках это может стать элегантным способом сделать интерфейсы умнее, избегать повторения и расширить библиотеки. В плохих руках; мы скоро будем видеть методы в интерфейсах, вызывающие this и приводящие его к конкретному типу. Бррр....
2) Остановка процессов.
Запуск дополнительного процесса - одна из вещей, что вы делаете, полу-зная, что вы вернетесь (дебажить) отлаживать ее, когда процесс (крякнет) (покрашится) прервется, (повесится) зависнет, или использует 100% процессора. Теперь класс Process был вооружен двумя новыми методами, чтобы помочь вам контролировать непослушные процессы.
Первый, isAlive(), позволяет вам с легкостью проверить, работает ли процесс, без необходимости ждать его. Второй и более мощный (внимание!) - destroyForcibly(), который позволяет вам (беспардонно) принудительно (убить) остановить процесс, который превысил время (ожидания или какое-то еще) или больше не нужен.
3) StampedLock'и.
А теперь нечто реально увлекательное. Никто не любит синхронизировать код. Это верный путь снизить производительность вашего приложения (особенно в больших масштабах) или хуже - привести его к зависанию. И все же, иногда у вас просто нет выбора.
Есть множество идиом для синхронизации многопоточного доступа к ресурсу. Одна из самых предпочитаемых - ReadWriteLock и связанные с ним реализации. Эта идиома снижает конкуренцию, позволяя множественным потокам использовать ресурс, блокируя только потоки, манипулирующие им. Звучит великолепно, но на практике этот замок такой медленный, особенно при большом числе пишущих потоков.
Это оказалось настолько плохо, что Java 8 представляет новый RWLock, названный StampedLock. Этот замок не только быстрее, но и также предлагает мощный API для оптимистичной блокировки, где вы можете получить блокировку чтения малой ценой, надеясь, что не произойдет письменной операции в течение критических участков кода. В конце участка вы запрашиваете у замка, происходила ли запись в течение этого времени, в случае чего вы можете решить, попробовать ли заново, усилить (escalate) замок или (сдаться) прекратить.
Этот замок - мощный инструмент и заслуживает поста целиком о себе. Я головокружительно взволнован этой новой игрушкой. Отлично!
Дополнительно можете прочитать здесь.
4) Конкурирующие записыватели.
Это еще один маленький драгоценный камень для любого работающего с многопоточными приложениями. Простой и эффективный новый API для чтения и записи в счетчики из множественных потоков. Иногда, это даже быстрее чем использование AtomicIntegers. Довольно круто!
5) Необязательные (или опциональные) значения.
Ох, null-указатели, головная боль всех Java разработчиков. Возможно, самое популярное из всех исключений, оно было с очень давних времен. По крайней мере, с 1965 года.
Одолжив у Scala и Haskell, Java 8 имеет новый шаблон, названный Optional, для упаковывания ссылок, который могут быть null. Это отнюдь не серебряная пуля(silver bullet, фразеологизм, означает простое и выглядящее магическим решение для сложной проблемы), что покончит с null, но скорее средство для API дизайнеров, чтобы обозначить на уровне кода (вместо документации), что null-значение может быть возвращено или передано к методу, и вызывающий абонент должен подготовиться к этому. Таким образом, это будет работать только для новых API, при условии, что вызывающие абоненты не позволят ссылке сбежать из обертки, где она может быть небезопасно разыменована.
Я должен сказать, что я довольно неоднозначно отношусь к этой функции. С одной стороны, null'ы остаются огромные проблемой, так что я ценю все сделанное для ее решения. С другой стороны я довольно скептически отношусь к тому, что это добьется успеха. Это потому, что использование Optional требует продолжительные усилия от всей компании, и имеет мало непосредственного значения. Без сильного принуждения, есть шансы, что это останется на левой стороне дороги.
Подробнее об Optional.
6) Аннотировать все.
Другое маленькое продвижение в языке Java: аннотации могут быть добавлены почти ко всему в вашем коде. Раньше, аннотации могли быть добавлены только к вещам типа классов или объявлений методов. С Java 8 аннотации могут быть добавлены к объявлениям переменных и параметров, при приведении значения к конкретному типу или даже размещении нового объекта. Это является частью сосредоточенных усилий (наряду с совершенствованием инструментов JavaDoc и API), чтобы сделать язык более дружественным по отношению к статическому анализу и измерительным инструментам (например, FindBugs). Это хорошая особенность, но так же, как и invokeDynamic, введенный в Java 7, его реальное значение будет зависеть от того, что общество сделает с ним.
7) Операции переполнения.
Теперь, вот набор методов, которые должны были быть частью основной библиотеки с первого дня. Мое любимое хобби отлаживать числовые переполнения, когда int’ы превышают 2 ^ 32, и переходить к созданию самых противных и наиболее непредвиденных ошибок (т.е. "как же я получаю это странное значение?").
Опять же, здесь нет серебряных пуль, но есть множество функций для оперирования числами, которые [функции] выбрасывают при перепеполнении в менее прощающем виде, чем ваш стандартный +/* оператор, который безоговорочно переполняет.
8) Проход по каталогу.
Перебор содержимого дерева каталогов уже давно является одним из тех, что набивают в Google - поиск (в этом случае вам, вероятно, посоветуют использовать Apache.FileUtils). Java 8 сделал классу Files подтяжку лица десятью новыми методами.
Мой любимый это walk(), который создает ленивый поток (важно для больших файловых систем) для перебора содержимого структуры каталога.
9) Сильная генерация случайных.
Там нет недостатка в разговорах в настоящее время о уязвимости паролей и ключей. Программная безопасность является сложным
бизнесом и склонна к ошибкам. Вот почему мне нравится новый метод SecureRandom.getinstanceStrong(), который автоматически выбирает самый сильный генератор случайных, доступный для виртуальной машины Java. Это уменьшает шансы того, что вам не удастся получить, или из-за слабого генератора, который сделает ключи и зашифрованные значения более восприимчивы ко взлому.
10. Date.toInstant().
Java 8 вводит совершенно новый API для дат и времени. Это довольно понятно, так как существующий не очень
хорош. Joda (Йода?), по сути дела, шел к Java API для дат и времени на протяжении нескольких лет. Тем не менее, даже с новым API одна большая проблема остается - есть тонна кода и библиотек с использованием старой API.
И все мы знаем, что они здесь останутся. Так что вы будете делать?
Для этого Java 8 совершил нечто довольно элегантное, добавив новый метод в класс Date по имени toInstant(), который преобразует его в новый API. Это позволяет сделать быстрый скачок к новому API, даже при работе с кодом, который использует старый API для дат (и будет продолжать это делать в видимом будущем).
Vash_the_Stampede
11 уровень
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ