Обновить
173.14

Java *

Объектно-ориентированный язык программирования

Сначала показывать
Порог рейтинга

Мне только что пришло интересное письмецо от Vaadin :)

Hi everyone,

This message is going out to the whole Vaadin community, as the news comes directly from years of your feedback, ideas, and passion for building better web apps in Java.

Now we’re taking another big step forward and Hilla will be merged into Vaadin Flow and discontinued it as a separate product, and our main focus will move fully toward building web UIs in pure Java.

Read more about this in our blog.

Whether you’ve been with Vaadin since the early days or just joined recently, we need your input to make it useful and helpful in your work, so let us know what you think. Thank you!

on behalf of the Vaadin Team

Sami

Если вкратце, Vaadin Flow - это "классический Vaadin", а Hilla - его React-версия.

Поэтому те, кто сидят на Vaadin Hilla, подумайте о переходе на Vaadin Flow. Ну или на чистый React :)

Теги:
0
Комментарии0

Ускоряем релизы и улучшаем качество с помощью Unleash

Сейчас в Альфа-Банке мы рассматриваем возможность внедрения фича-тоглов в наш проект и проводим исследование уже существующих решений. В рамках него мне удалось глубоко познакомиться с Unleash — самой популярной платформой для фича-тоглов на данный момент.

В статье «Разбираемся с Feature Toggle на примере Unleash» подробно объясняем ключевые понятия и возможности Unleash — от определения тоглов до сложных стратегий и сегментов. Демонстрируем реальные примеры кода и архитектурных подходов на Java и Spring и рассказываем о практических плюсах Unleash

Статья будет полезна Backend-разработчикам и тимлидам, DevOps и SRE-инженерам, менеджерам продуктов и качества и всем, кто планирует масштабировать систему с десятками и сотнями микросервисов, где требуется централизованный и удобный контроль остаточного риска внедрения новых функций.

Теги:
+1
Комментарии0

Приглашаем на вебинарпосвященный вопросам перехода на отечественную Java-среду исполнения. Обсудим, как указы №166 и №250 и приказ Минцифры №21 задали курс на импортозамещение и определили классы ПО для замены. 

Поговорим о рисках зарубежных решений, требованиях к безопасности и роли среды исполнения как ключевого слоя ИТ-систем

Кому будет полезен вебинар:
• Директорам по информационной безопасности
• Техническим директорам
• Директорам по ИТ
• Руководителям отдела программного обеспечения
• Разработчикам информационных систем

Вебинар проведет:
Роман Карпов, Директор по стратегии и развитию технологий Axiom JDK, Руководитель ИБ-комитета АРПП "Отечественный софт", Руководитель технического комитета АНО "Открытый код", Советник Министра цифрового развития по вопросам системного ПО, председатель ЦКР по управлению ИТ-инфраструктурой

Когда: 01 октября 2025 г.

Во сколько: 11:00–12:30 по мск

Формат: Онлайн

Участие: Бесплатное (нужно предварительно зарегистрироваться)

Теги:
+4
Комментарии0

Игра с огнём, или нулевой байт

В одном проекте заказчик потребовалось различать (и делать поиск) по трем состояниям текстового поля в Lucene индексе:

  1. непустое значение (работает из коробки)

  2. пустая строка "" (не поддерживается люсин)

  3. null (не поддерживается люсин)

Lucene не хранит null и пустые строки "" - значения просто не индексируется. Для бизнес-логики, где нужно различать все три состояния, стандартных механизмов Lucene недостаточно.

Создание "специальных" замен в виде комбинаций типа "_null_" текста и спецсимволов - ломается тестерами которые пропускали различный мусор через индекс.

Был выбран компромиссный подход:

  • "\0" (строка из нулевого байта) используется как маркер null

  • "\0\0" (строка из двух нулевых байтов) используется как маркер ""

Пробило в холодный пот? Правильно, и меня тоже. Тем не менее, это рабочий способ.

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

Плюсы:

  • \0 — это валидный символ в Java-строке, который практически не встречается в реальных данных.

  • Символ \0 невозможно ввести напрямую из внешних систем, редакторов или форм без явного кодирования. Это защищает от случайных коллизий, даже если тестировщики пробуют «мусорные» символы.

  • Таким образом достигается стабильное различие между null, "" и содержимыми строками.

Риски:

  • Утечки наружу. Маркеры \0 могут попасть в API-ответы, логи, сериализацию. В нашем случае lucene был в обертке и поиск напрямую не использовался внешними системами - обработчик вызовов был инкапсулирован в прокси сервис.

Использование \0 и \0\0 как маркеров — это баланс между «желанием клиента» и технической безопасностью. Работает, но требует дисциплины: любая утечка этих символов превращает решение в источник трудноуловимых багов снаружи индекса.

Теги:
Всего голосов 3: ↑3 и ↓0+4
Комментарии0

Приглашаем на Java Jam — бесплатный митап ЮMoney для Java-разработчиков

Спикеры из ЮMoney и главный эксперт по технологиям Сбера расскажут о своём опыте и пообщаются с аудиторией. Вот какие темы будут на митапе:

🟣 Как мы уменьшали нагрузку на базы данных в очередях задач. Расскажем, как реализовать надёжное асинхронное и отложенное исполнение задач.

🟣 Советы по производительному коду. Поговорим про время выполнения программ, работу со строками и коллекциями, вещественную и битовую арифметику, алгоритмические трюки и многое другое.

🟣 Уязвимости не пройдут. Обсудим, как повысить безопасность разработки с помощью SAST и SCA.

25 сентября, в четверг, в 18:30 (мск) — приходите на митап в Санкт-Петербурге или подключайтесь онлайн!

Подробности — на сайте митапа Java Jam 

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Привет!

Рады поделиться с сообществом отличной новостью: теперь Explyt доступен для скачивания с JetBrains marketplace.

Установить Explyt 4.2 с AI агентом для написания кода, тестирования и дебаггинга можно в один клик из вашей IDE (IntelliJ IDEA 2024.1+, PyCharm 2024.1+, GoLand 2024.1+).

Новые версии плагина могут появляться на маркетплейсе с небольшой задержкой, поэтому мы сохранили возможность установки с нашего сайта.

Всем отличной пятницы 🖖

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Привет, Хабр!

Всего две недели назад вышла версия Explyt 4.1 с поддержкой Python, MCP серверов, новыми Rules и Workflows, а уже сегодня мы рады поделиться новым релизом Explyt 4.2 с поддержкой Go. Теперь все фичи AI агента доступны в GoLand.

Важное обновление

Начиная с версии Explyt 4.2, мы вводим процедуру регистрации новых пользователей. Этот процесс займёт 30 секунд и позволит: 

  • повысить стабильность и доступность инфраструктуры из любой точки мира 

  • корректно соблюдать правовые требования 

Если вы уже пользуетесь плагином, потребуется пройти авторизацию в своём аккаунте прямо из интерфейса плагина.

Запуская бесплатный 30-дневный триал Personal версии, вы сразу получаете 4000 кредитов, которые можно использовать для запросов к LLM.

Возможность пользоваться своими моделями без регистрации в версии Community по-прежнему остается.

Скачать Explyt 4.2 можно с нашего сайта. Для багрепортов и фичриквестов - GitHub Issues и чат с командой плагина. Будем рады вашей обратной связи и философским вопросам 🖖

Теги:
Всего голосов 6: ↑5 и ↓1+4
Комментарии2

Виртуальные потоки кажутся простым способом ускорить I/O. Но на Java 21 многие сталкивались со стагнацией из‑за пиннинга: когда код входит в synchronized и внутри выполняет блокирующую операцию (I/O, wait(), ожидание монитора), виртуальный поток «прибивается» к carrier‑потоку и не может отмонтироваться. Под нагрузкой это быстро исчерпывает пул carrier‑потоков и «замораживает» обработку. Часто как побочный симптом растет число соединений в CLOSE_WAIT, потому что обработчики не успевают корректно закрывать сокеты.

Что изменилось:

В JDK 24 реализован механизм, благодаря которому виртуальные потоки больше не пиннятся внутри synchronized, включая ожидание монитора и Object.wait()): JVM умеет корректно «размонтировать/перемонтировать» поток. Это почти полностью снимает главный источник проблем с Loom и в большинстве случаев избавляет от необходимости переписывать synchronized на ReentrantLock ради масштабируемости. Редкие источники пиннинга остались вне synchronized, например, JNI — их стоит искать профилированием и наблюдаемостью (JFR‑события).

Дальше — еще удобнее в JDK 25:

Scoped Values становятся финальными — надежная альтернатива ThreadLocal для передачи неизменяемого контекста без накладных расходов и утечек. Structured Concurrency остается в статусе preview и хорошо сочетается с моделью виртуальных потоков.

Что имеет смысл сделать уже сейчас без перелома архитектуры:

  1. Планировать переход на JDK 25, чтобы получить финальные Scoped Values и полный набор улучшений Loom.

  2. Запускать задачи через Executors.newVirtualThreadPerTaskExecutor() или фабрику Thread.ofVirtual() — так вы используете Loom «как задумано».

  3. Проаудировать горячие пути — убрать блокирующие вызовы из‑под synchronized, сузить критические секции. При необходимости оставлять ReentrantLock, но не рассчитывать на него как на универсальное лекарство от пиннинга.

  4. Включить наблюдаемость — отслеживать события пиннинга виртуальных потоков, рост очередей/времени ожидания и аномальный CLOSE_WAIT.

  5. Там, где сегодня используются тяжелые ThreadLocal, по возможности переносить на Scoped Values после обновления до JDK 25 и обновлять библиотеки до версий с поддержкой Loom.

Как именно работает исправление пиннинга и как лечить «больные места» рассказали в статье Виртуальные потоки в Java: эволюция, практика, подводные камни.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Если вы сталкиваетесь с задачами оптимизации, но существующие материалы не дают системного понимания — курс «Java Advanced II: высокопроизводительная Java» (JVA-076) для вас. Никакой воды — только лабораторные с разбором реальных инцидентов.

9 сентября на бесплатном вебинаре «Производительность Java под нагрузкой: заглянем под капот» мы детально разберем содержание курса:

➕ Инструменты: JMeter, JMH, JFR, JITWatch — не просто обзор, а решение задач.

➕ JVM: тюнинг GC, анализ JIT, управление флагами.

➕ Hardcore: off-heap память через Unsafe, свои структуры данных.

➕ Архитектура: кэширование и анализ производительности.

Курс для вас, если вы хотите:

✔️ Осознанно подходить к тюнингу JVM.

✔️ Быстро находить и устранять утечки памяти и узкие места

✔️ Принимать архитектурные решения, зная их цену в производительности

✔️ Говорить с эксплуатацией на языке метрик

А вебинар позволит оценить  практическую ценность курса перед принятием решения об обучении.

Дата: 9 сентября

Время: 18:00-19:00 (Мск)

➡️ Регистрация

Теги:
Рейтинг0
Комментарии0

Давно хотел это написать, но как будто не было триггера и вот в пятницу я его поймал. Объясняю. Хочу выразить благодарность, чуть-чуть извиниться перед разработчиками Intellij Idea и простить их. Вот прям от души.

Когда-то в детстве я 3 года отучился игре на фортепиано, но переходный возраст (пиво, футбол и девки) победил и я ушёл из музыкальной школы. К чему я.. я программист уже 8 лет и я не встречал ничего прекрасней чем Intellij Idea.. ты не разрабатываешь - ты играешь на рояле... это автодополнение или как его назвать, подсказки, я просто в шоке. Не всегда угадывает что я хочу, но часто. Триггер я поймал когда добавлял новый объект в enum вида ERROR_INFO("text") и пока строчил название объекта представлял как лезу в переводчик, чтобы точно грамотно написать на английском текст, а Идея предложила мне текст, который я хотел написать, причём не все слова были в названии объекта.. как итог я прям счастлив от такой супер приятной мелочи (не факт что мелочи) и вот спустя два дня строчу этот пост, т.к. я прям обязан это сделать, не знаю почему. Я понимаю, что нейросети, но один и тот же салат Цезарь каждый повар делает по разному.

То, от чего я прям балдею:

  • shift + f6, переименовывает всё и везде - просто песня

  • ctrl + shifr + backspace - показывает всё что я поменял в классе, а не я глазами ищу строчки

  • ctrl + e - показывает классы в порядке убывания по использованию, не ищешь в браузере слева

  • в браузере жмёшь на значок цели вверху и тебе показывается где класс лежит буквально

  • в разделе гита смотришь изменения класса, нажимаешь f4 и тебе открывается этот класс

  • супер поиск ctrl+shift+f или просто два шифта

  • работа с базами данных просто сказка (даже Дата Грип редко открываю, его тоже люблю)

  • офигенные приколы типа ctrl+d с добавлением ниже второй такой же строки, удалить строку со смещением наверх shift+del

  • быстрый переход с ошибки на следующую ошибку с помощью f2

  • ctrl+p показать все ожидаемые параметры в методе

  • ctrl+shift+вверх/вниз гоняет как строку, так и целый кусок :)

  • и ещё дофига всего!!

В общем я счастлив, что моё хобби и работа это одно и то же, а то что есть Идея счастье увеличивает. Извиниться хочу, что я ни разу не покупал подписку. Она мне досталась после прохождения какого-то курса по Java, а сейчас вообще не могу купить, т.к. технически это невозможно из РФ. Здесь я прощаю Jet Brains, без пафоса, понять можно наверное (и на царей жёны давили :) Как смогу - обязательно куплю подписку, потому что это охренеть какой труд и верх перфекционизма для меня как для такого же любителя прекрасного!! И я хотел бы знать - это один такой перфекционист у них всё таки, или целая команда (в плане, что Идея именно такая какая есть). Кто этот "фундамент" образа?

Кто скажет, что пост рекламный - вы не правы! Просто признался в любви IDE :)) и стало легче! Пашем дальше..

Теги:
Всего голосов 6: ↑5 и ↓1+6
Комментарии4

В продолжение темы серверного HTML рендеринга на Kotlin.

Если вы не читали статью, кратко напомню о чём речь: я написал небольшой можно сказать фреймворк для генерации HTML на стороне сервера на Kotlin. И поддержку строготипизированных routes для удобного создания ендпоинтов, ссылок на них и форм. Теперь Spring Views можно создавать на Kotlin и по крайней мере в моих проектах (а один из них очень большой - сотни отдельных страниц и десятки виджетов) это дало мне огромное удобство, уверенность, безопасность, рефакторо-пригодность, простое версионирование и переиспользование кода, например, теперь я точно не сделаю опечатку в URI или имени параметра и не смогу передать неверный тип данных на endpoint.

Одна из проблем которые до недавнего времени была в связи с использованием данного фреймворка - это CSS-стили. Приходилось либо инлайнить стили непосредственно для HTML элемента, либо мейнтейнить огромный (или несколько поменьше) CSS файл без возможности внятно следить за старыми более неиспользуемыми классами и селекторами. Кто создавал большие CSS файлы знает о чём я говорю - со временем количество классов накапливается и вычистить их не задев чего-то всё ещё нужного очень сложно. Вот так приходилось работать с CSS стилями раньше:

DIV("css-class-name") {...}
// или
DIV {
  style("color: red;")
  +"Hello World"
}

В принципе жить можно, но хотелось чего-нибудь:

  • что-то на подобии Styled-Components из ReactJS, но так же на Kotlin

  • по возможности поддержку JVM hot-reload в режиме отладки

  • как следствие кода на Kotlin - иметь возможность всегда отслеживать зависимости и удалять более неиспользующиеся CSS-правила.

Долго думал как это получше сделать, и пока что первая версия получила вот такой синтаксис:

@Component // Spring @Component
object MyCssClass : CssClass({
  style = "color: black;"
  hover = """
    color: red;
    text-decoration: underline;
  """
})

...

A(MyCssClass) {
  href(SomeUsefulRoute(param = 1))
  +"Click me"
}

То есть объявляем object который будет нести информацию о CSS свойствах элемента. И далее просто используем его в тех же местах где раньше можно было указать css-class-name. CssClass поддерживает массу "псевдоклассов" типа hover, active, firstOfType, before, after и так далее, так же можно добавлять media брейкпоинты и всякие другие штуки. Вот более насыщенный пример:

@Component
object Container : CssClass({
    style = "padding: 25px;"
    hover = "background: #eee;"

    add(">a", "color: green;")
    add(">a:hover", "text-decoration: underline;")

    media("max-width: 991px") {
        style = "padding: 10px;"
    }
})

Вы наверняка заметили двойные скобочки ({...}) - в конструктор я передаю функцию-инициализатор стилей. Это нужно для того, чтобы в дебаг режиме JVM можно было на лету менять свойства CSS класса без перезапуска приложения: код который генерирует сам css-файл может быть запущен в режиме dev-mode, когда на каждый запрос файла будут выполнены все функции-инициализаторы ещё раз и файл будет собран заново.

Если по какой-то причине вам не нравится object - можно просто объявить class и использовать его:

@Component
class Container : CssClass({...})
...
DIV(Container::class) { ... }

Теперь в проекте порядок с CSS стилями - нет давно умерших, всегда можно найти точки использования, стили лежат рядом с виджетами и т.п.

Смотрите исходники тут. Фидбэк приветствуется, всем хорошего дня.

Теги:
Всего голосов 4: ↑4 и ↓0+6
Комментарии4

Запись вебинара «От кода до запуска: российский стек для Java — Axiom JDK и OpenIDE» доступна для просмотра

Вебинар прошёл, а воспоминания запись осталась.

Если вы не успели на вебинар, но очень хотели, то не переживайте! Мы всё записали, чтобы вы могли посмотреть в любое удобное время.

Что обсуждали на вебинаре:

  • Вызовы отечественной ИТ индустрии.

  • Портфолио Axiom JDK.

  • Регуляторика и соответствие стандартам.

  • РБПО: процесс создания доверенных Java продуктов.

  • Зачем OpenIDE разработчику и бизнесу.

  • В чём проблема собрать Intellij IDEA самостоятельно

  • Как будет развиваться OpenIDE.

Запись уже доступна на площадках.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Вебинар "От кода до запуска: российский стек для Java — Axiom JDK и OpenIDE"

Приглашаем на вебинар, посвященный безопасному стеку базовых технологий для разработки и исполнения Java-приложений и безопасной среде разработке OpenIDE. Вы поймете, что такое OpenIDE, как это всё относится к Intellij IDEA, зачем OpenIDE бизнесу и какие у проекта OpenIDE планы на будущее.

Кому будет полезен вебинар:
• тимлидам
• разработчикам
• DevOps

Вебинар проведут:
• Дмитрий Сапожников, технологический консультант Axiom JDK
• Илья Сазонов, директор по продуктам Axiom JDK, направления Spring и OpenIDE

Когда: 21 августа 2025 г.

Во сколько: 11:00–12:30 по мск

Формат: Онлайн

Участие: Бесплатное (нужно предварительно зарегистрироваться)

Теги:
Всего голосов 2: ↑1 и ↓10
Комментарии0

Ближайшие события

Где учиться бэкенду

Привет! Мы на Хабр Карьере собираем сотни онлайн-курсов в IT или digital на маркетплейсе курсов и каждую неделю делаем подборки обучений для тех, кто хочет учиться какой-то специализации с нуля или для тех, кто уже в профессии, но чувствует, что хочет прокачать навыки.

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

Алгоритмы и структуры данных

Базовые концепции программирования: сортировки, графы, очереди, деревья, хэш-таблицы и др. Применяются для оптимизации решений и подготовки к собеседованиям.

Git

Система контроля версий. Позволяет вести историю изменений, работать с ветками, мержить и откатывать изменения в коде.

Python 

Язык общего назначения, популярен в вебе, автоматизации, ML.

FastAPI

Лёгкий и быстрый фреймворк для создания REST API с поддержкой async/await и автогенерацией схем.

Django

Фреймворк для быстрой разработки web-приложений, включает ORM, авторизацию и админку из коробки.

JavaScript / TypeScript

JavaScript — язык для веб-интерфейсов и серверной логики (через Node.js). TypeScript — его надстройка с типизацией, упрощающая масштабируемую разработку.

Java / Spring

Java — строго типизированный язык. Spring — основной фреймворк для создания REST API, микросервисов и корпоративных приложений.

Go

Компилируемый язык от Google с простым синтаксисом и встроенной поддержкой параллелизма. Используется в highload-системах, DevOps и backend-разработке.

C#

Язык от Microsoft, используется с платформой .NET. Применяется в разработке desktop-, web-, enterprise- и игровых приложений.

PHP

Скриптовый язык, ориентированный на веб. Часто используется с CMS (например, WordPress) и фреймворками (Laravel, Symfony).

Ruby

Язык с лаконичным синтаксисом. Наиболее известен благодаря фреймворку Ruby on Rails, ориентированному на быструю разработку веб-приложений.

SQL / PostgreSQL

SQL — язык запросов к реляционным БД. PostgreSQL — популярная СУБД, используется в веб-приложениях, аналитике, поддерживает расширения и транзакции.

Docker

Инструмент для упаковки приложений в контейнеры. Обеспечивает воспроизводимую среду разработки и удобное развертывание.

Не забывайте, что сегодня, чтобы быть востребованным специалистом, важно прокачивать и софты — такие курсы на маркетплейсе тоже есть.

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

Смотреть курсы по всем специализациям

Теги:
Всего голосов 6: ↑4 и ↓2+6
Комментарии0

Под пост в телеграм про наш ответ аналог Grafana пришли руководители "Лаборатории Числитель" и конкретно "Пульта", в чью систему входит платформа мониторинга и анализа "Графиня".

Дмитрий Унтила и Владимир Утратенко любезно ответили на ряд вопросов по платформе, и я хотел бы подвести краткое резюме:

  • Запрос на аналог Grafana появился в момент продажи "Пульта", так как "не всем можно брать забугорный опесорс себе в контур. Потому решили делать. А название Графиня просто ради лулзов."

  • Графиня писалась с полного нуля. Хотя предложение взять за основу Grafana было, но команда смогла обосновать геморрой, который на неё упадёт, если взяться за доработку, и объяснила руководству, почему лучше сделать с нуля.

  • Время разработки: 3 месяца - MVP, 6 месяцев - 1 релиз.

  • Технологический стек: фронтенд: TypeScript + React 18, бэкенд: TypeScript + Node.js, база данных: MongoDB, плагины: Java.

  • На мое предложение сделать проект опенсорс Дмитрий Унтила пообещал подумать. Но, понятное дело, если это часть коммерческого продукта, прям сильно думать в лаборатории не будут))

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

Благодарю парней за такой актив и обратную связь, рад, что у людей есть на это время!

Теги:
Всего голосов 3: ↑2 и ↓1+1
Комментарии3

Многие крупные компании применяют Go, а спрос на опытных инженеров, владеющих Go, высок как никогда. Онбординг проходит действительно быстро, и у нас есть успешные тому примеры. Все благодаря общей простоте языка и отсутствию function coloring. В карточках рассказываем, как это получилось у Кирилла в 2ГИС↓

Теги:
Всего голосов 6: ↑3 и ↓30
Комментарии4

Обновлена информационная база JBook по изучению Java полностью на русском языке. Проект помогает выучить язык с полного нуля и до уровня поиска работы, включая концепции, приёмы, актуальные фреймворки, ООП, основные алгоритмы, паттерны решения задач и видеоразборы. Есть множество упражнений разного уровня сложности к каждой лекции. Проект развивается с 2018 года и постоянно обновляется вместе с версиями Java, документацией и новыми подходами к разработке.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Сегодня у нас задачка с подвохом для тех, кто пишет на Java. Какой результат будет выведен в консоль? Пишите в комментариях!

import java.util.stream.Stream;
public class Main {
    public static void main(String[] args) {
        Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
        Integer result = prepareStream(stream);
        System.out.printf("Result after stream processing: %s%n", result);
    }

    private static Integer prepareStream(Stream<Integer> stream) {
        System.out.printf("Incoming stream with: %d elements%n", stream.count());
        return stream
                .map(integer -> integer++ + ++integer)
                .filter(integer -> integer % 3 == 0)
                .reduce(0, Integer::sum);
    }
}

Дальше будет решение, поэтому если не хотите спойлеров — не читайте!

.

.

.

Подвох в том, что будет выброшено исключение:

Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
 at java.base/java.util.stream.AbstractPipeline.<init>(AbstractPipeline.java:203)
 at java.base/java.util.stream.ReferencePipeline.<init>(ReferencePipeline.java:96)
 at java.base/java.util.stream.ReferencePipeline$StatelessOp.<init>(ReferencePipeline.java:800)
 at java.base/java.util.stream.ReferencePipeline$3.<init>(ReferencePipeline.java:191)
 at java.base/java.util.stream.ReferencePipeline.map(ReferencePipeline.java:190)
 at Main.prepareStream(Main.java:16)
 at Main.main(Main.java:7)

Исключение выбрасывается из-за того, что при выводе в консоль лога с количеством элементов стрима мы использовали операцию stream.count(), которая является терминальной и делает дальнейшее использование стрима невозможным.

System.out.printf("Incoming stream with: %d elements%n", stream.count());

Ну а после того, как мы избавимся от лога, который нам все ломает, правильный ответ будет — 18.

С учетом postfix и prefix инкремента числа в каждой итерации мы получаем:
.map(1 → 1 + 3)...(5 → 5 + 7)

Потом после фильтрации по делению на 3 без остатка в стриме остаются числа 6 и 12. И при помощи операции reduce() находим сумму этих чисел.

Теги:
Всего голосов 9: ↑4 и ↓5+2
Комментарии0

Приглашаем на бесплатный вебинар «Как стартовать в Java и не потеряться: структура, инструменты, кейсы». 

📅 Дата: 8 июля

Время: 18:00–19:00 (Мск)

Java — один из самых востребованных языков, но с чего начать, если вокруг столько информации, а подходы быстро устаревают? В прямом эфире разберем:

✔️ С чего начать в Java, чтобы не тратить время на устаревшие методы

✔️ Ключевые инструменты (JUnit, Maven, Git) — как их применять с первых шагов

✔️ Кейсы, которые помогут на собеседованиях и в реальных проектах

✔️ Как избежать типичных ошибок новичков и сразу писать чистый код

Почему стоит прийти?

🔹 Узнаете, как быстро войти в Java с актуальными знаниями

🔹 Увидите разбор реальных примеров и учебных проектов

🔹 Получите рекомендации по ресурсам и дальнейшему развитию

👨‍🎓 Спикер: Судакевич Игорь — преподаватель международного уровня, более 15 лет работает в ИТ. Уполномоченный инструктор корпорации Oracle. Магистр компьютерно-информационных технологий. Инструктор платформы Udemy. 

🔗 Записаться

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии0

Сегодня 24 июня до 23.59 успейте принять участие в главном DevOps-исследовании года!

Это last call по исследованию состояния DevOps 2025 в России, проводимого компанией «Экспресс 42» при поддержке Axiom JDK. Оно закрывается сегодня ночью в 00.00 по мск.

Помогите отследить тренды и понять, как опыт разработчиков (DX) влияет на эффективность команд и успех компании. Фокус State of DevOps Russia 2025 на developer experience. 

Осталось всего несколько часов — пройдите опрос до 23.59.

Мы вместе изучим, что помогает компаниям формировать позитивный опыт для разработчиков и как на него влияют внутренние платформы, ML/AI-инструменты, облачные технологии и практики ИБ.

Опрос анонимный и займёт ~20 минут. Данные нужны, чтобы понять, какие инструменты реально работают в проде, а какие — только в красивых презентациях.

Если вы — DevOps-инженер, разработчик, тестировщик, админ, тимлид, CTO, техдир — внесите свой вклад.

Все участники получат:

  • Полный доступ к результатам исследования;

  • Возможность выиграть билеты на Highload++ и DevOpsConf.

  • Промокоды и мерч от партнёров (AvitoTech, VK Cloud, Positive Technologies, Selectel, ecomtech, Okko, Онтико, Т-Технологии,  Axiom JDK, Экспресс 42).

Участвуйте сегодня и голос вашей команды будет услышан. Чем больше ответов — тем лучше получится карта DevOps-практик в России.

Почитать предыдущие отчёты можно тут

PS. А у кого есть интерес заняться девопсом в команде Axiom JKD, загляните сюда.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Вклад авторов