相关文章推荐
小百科
›
Поиск первого элемента по критериям в Stream Java
开心的苦咖啡
7 月前
</noscript><a class="top-bar_topBar__m1u3g" href="https://sky.pro/promo/summersale?utm_source=skypro_wiki&utm_medium=free" target="_blank"><button class="top-bar_topBarClose__o2rEi"><svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewbox="0 0 50 50"><path fill="currentColor" d="M 9.15625 6.3125 L 6.3125 9.15625 L 22.15625 25 L 6.21875 40.96875 L 9.03125 43.78125 L 25 27.84375 L 40.9375 43.78125 L 43.78125 40.9375 L 27.84375 25 L 43.6875 9.15625 L 40.84375 6.3125 L 25 22.15625 Z"/></svg></button><div class="top-bar_topBarContent__qpAa7">ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%<span class="top-bar_topBarAction__o2oXp">Забронировать скидку</span></div></a><header class="border-b-2 border-b-secondary-base py-20 sm:pb-8"><div class="container flex items-center gap-36 sm:flex-col sm:items-start sm:gap-20"><div class="flex w-full items-center lg:justify-between gap-48"><a href="/wiki/"><img alt="logo" fetchpriority="high" width="213" height="24" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/logo.7310b88b.svg"/></a><div class="group/menu flex gap-16 items-center lg:hidden"><div class="group/menu-expand cursor-pointer relative"><div class="group-hover/menu-expand:text-[#565eef] flex gap-[6px] items-center">Все курсы<img alt="Все курсы" loading="lazy" width="13" height="7" decoding="async" data-nimg="1" class="translate-y-[1px]" style="color:transparent" src="/wiki/_next/static/media/arrow-down.b7053fd5.svg"/></div><div class="group-hover/menu-expand:flex hidden flex-col gap-12 absolute top-24 left-[-16px] bg-[#ecf6ff] z-[1] rounded-xl p-16"><a class="hover:text-[#565eef]" href="https://sky.pro/courses/programming?utm_source=skypro_wiki">Программирование</a><a class="hover:text-[#565eef]" href="https://sky.pro/courses/analytics?utm_source=skypro_wiki">Аналитика</a><a class="hover:text-[#565eef]" href="https://sky.pro/courses/design?utm_source=skypro_wiki">Дизайн</a><a class="hover:text-[#565eef]" href="https://sky.pro/courses/marketing?utm_source=skypro_wiki">Аналитика</a></div></div><a class="hover:text-[#565eef]" href="https://sky.pro/webinars?utm_source=skypro_wiki">Вебинары</a><a class="hover:text-[#565eef]" href="https://sky.pro/promo/media/main-proftest?utm_source=skypro_wiki&utm_medium=how-it">Разобраться в IT</a><a class="hover:text-[#565eef]" href="https://sky.pro/referral_graduate?utm_source=skypro_wiki">Реферальная программа</a><a href="https://sky.pro/?utm_source=skypro_wiki&utm_medium=free" class="flex items-center h-[36px] bg-[#271a58] text-[#ffffff] rounded-[32px] text-[14px] leading-tight gap-[10px] justify-center py-0 px-[15px] hover:bg-[#443677] active:bg-[#1b1142] whitespace-nowrap"><img alt="Получить профессию в Skypro" loading="lazy" width="22" height="20" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/profession.e342f684.svg"/>Получить профессию в Skypro</a></div><button class="hidden lg:flex"><img alt="Меню" loading="lazy" width="32" height="32" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/burger-menu.e5065ba6.svg"/></button></div></div><div class="container"><nav class="text-m mt-20 inline-flex w-[100%] gap-24 overflow-auto text-primary-base sm:gap-16"><div><a data-test="ссылка на раздел в шапке" href="/wiki/java/">Java</a></div><div><a data-test="ссылка на раздел в шапке" href="/wiki/python/">Python</a></div><div><a data-test="ссылка на раздел в шапке" href="/wiki/html/">HTML</a></div><div><a data-test="ссылка на раздел в шапке" href="/wiki/sql/">SQL</a></div><div><a data-test="ссылка на раздел в шапке" href="/wiki/javascript/">JavaScript</a></div><div><a data-test="ссылка на раздел в шапке" href="/wiki/profession/">Profession</a></div></nav></div></header><main class="grow"><nav class="relative border-b-2 border-b-secondary-base"><div class="pb-[42px] bg-[rgb(4,11,41)] bg-no-repeat md:bg-right-bottom md:bg-[length:50%] bg-[length:30%] bg-[75%_10%]" style="background-image:url(/wiki/_next/static/media/top-banner-bg.f80cadfa.webp)"><div class="container flex gap-8 py-16 sm:overflow-x-auto"><div class="flex items-center gap-8"><div class="caption-s cursor-pointer whitespace-nowrap text-secondary-base hover:opacity-80"><a href="https://sky.pro/">Главная</a></div><div class="mb-[-2px] w-16 shrink-0 sm:mb-0"><img alt="arrow" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/nav-arrow.45d56d4a.svg"/></div></div><div class="flex items-center gap-8"><div class="caption-s cursor-pointer whitespace-nowrap text-secondary-base hover:opacity-80"><a href="/wiki/">Wiki</a></div><div class="mb-[-2px] w-16 shrink-0 sm:mb-0"><img alt="arrow" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/nav-arrow.45d56d4a.svg"/></div></div><div class="flex items-center gap-8"><div class="caption-s cursor-pointer whitespace-nowrap text-secondary-base hover:opacity-80"><a href="/wiki/java/">Java</a></div><div class="mb-[-2px] w-16 shrink-0 sm:mb-0"><img alt="arrow" loading="lazy" width="16" height="16" decoding="async" data-nimg="1" style="color:transparent" src="/wiki/_next/static/media/nav-arrow.45d56d4a.svg"/></div></div><div class="caption-s whitespace-nowrap text-secondary-base">Поиск первого элемента по критериям в Stream Java</div></div><a href="https://sky.pro/promo/media/main-proftest?utm_source=skypro_wiki&utm_medium=top_banner" target="_blank" class="container block"><div class="text-white font-bold md:text-[30px] text-[42px]">Пройти тест: кто я в IT</div><div class="text-white mt-8 font-medium text-[20px]">Для тех, кто не определился с профессией, но хочет сменить работу</div><div class="mt-60 md:mt-32 text-white font-medium bg-gradient-to-t from-[rgb(88,0,255)] to-[rgb(175,133,255)] rounded-[20px] text-center inline-block py-8 px-24">Хочу понять, кто я в IT</div></a></div></nav><div class="container flex justify-between pb-32 pt-24 sm:flex-col sm:pb-24"><div class="flex gap-40"><article class="w-[800px] sm:w-full"><div><h1 class="heading-xl mb-16" data-test="заголовок статьи">Поиск первого элемента по критериям в Stream Java</h1><div class="prof-test_profTest__FCXdZ"><div class="prof-test_info__xMaLx">Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию<div class="prof-test_subInfo__lm0zX">В конце подарим <span class="prof-test_bright___hvi9">скидку до 55%</span> на обучение</div></div><div class="prof-test_quiz__X2jGw"><div class="prof-test_question__31EsQ"><div class="prof-test_questionTitle__lGUuU">Я предпочитаю </div><div class="prof-test_questionStatus__fWuuy">0%</div></div><div class="prof-test_quizAnswerList__xNwRJ"><div class="prof-test_quizAnswer__8ipMj "><div>Работать самостоятельно и не зависеть от других</div><div class="prof-test_quizRadio__VFp0Y"/></div><div class="prof-test_quizAnswer__8ipMj "><div>Работать в команде и рассчитывать на помощь коллег</div><div class="prof-test_quizRadio__VFp0Y"/></div><div class="prof-test_quizAnswer__8ipMj "><div>Организовывать и контролировать процесс работы</div><div class="prof-test_quizRadio__VFp0Y"/></div></div></div></div><h2 id="bystriy-otvet" class="heading-m mb-16 mt-32">Быстрый ответ</h2><p class="text-l mt-12">Чтобы отыскать и выбрать <strong class="font-semibold">первый элемент</strong>, который удовлетворяет заданному условию в потоке данных, служат методы <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">filter()</code> и <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">findFirst()</code>. Эти методы реализуют эффективную технику отбора <strong class="font-semibold">элементов</strong> на основе конкретного <strong class="font-semibold">предиката</strong>.</p><p class="text-l mt-12">Взглянем на пример кода:</p><div class="my-16 flex"><div class="relative w-full rounded-xl border border-solid border-tetriary-base"><div class="rounded-t-xl bg-secondary-base"><div class="flex items-center justify-between px-16 py-8"><div class="caption-xs">Java</div><div><div class="flex cursor-pointer items-center gap-4 py-4 text-secondary-base hover:opacity-80"><div class="flex-none"><svg class="fill-current transition-colors" width="11" height="13" viewbox="0 0 11 13" xmlns="http://www.w3.org/2000/svg"><path d="M9 8.75C9.39844 8.75 9.75 8.42188 9.75 8V3.21875C9.75 3.125 9.70312 3.03125 9.63281 2.96094L8.03906 1.36719C7.96875 1.29688 7.875 1.25 7.78125 1.25H5.25C4.82812 1.25 4.5 1.60156 4.5 2V8C4.5 8.42188 4.82812 8.75 5.25 8.75H9ZM10.1484 2.42188C10.3594 2.63281 10.5 2.9375 10.5 3.21875V8C10.5 8.84375 9.82031 9.5 9 9.5H5.25C4.40625 9.5 3.75 8.84375 3.75 8V2C3.75 1.17969 4.40625 0.5 5.25 0.5H7.78125C8.0625 0.5 8.36719 0.640625 8.57812 0.851562L10.1484 2.42188ZM1.5 3.5H3V4.25H1.5C1.07812 4.25 0.75 4.60156 0.75 5V11C0.75 11.4219 1.07812 11.75 1.5 11.75H5.25C5.64844 11.75 6 11.4219 6 11V10.25H6.75V11C6.75 11.8438 6.07031 12.5 5.25 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5C0 4.17969 0.65625 3.5 1.5 3.5Z"/></svg></div><div class="caption-xs transition-colors">Скопировать код</div></div></div></div></div><pre class="flex overflow-y-auto px-16 py-12"><code class="lang-java">Optional<String> firstMatch = Stream.of("apple", "banana", "cherry") .filter(s -> s.startsWith("b")) .findFirst(); firstMatch.ifPresent(System.out::println); // Выведет "banana"</code></pre></div></div><p class="text-l mt-12">Функция фильтрации (<code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">filter(s -> s.startsWith("b"))</code>) отфильтровывает элементы, начинающиеся на "b". <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">findFirst()</code>, сохраняет <strong class="font-semibold">первый найденный элемент</strong> в контейнер <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">Optional</code>. Метод <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">ifPresent()</code> элегантно обрабатывает содержание контейнера.</p><p class="text-l mt-12">А что если <strong class="font-semibold">поток данных пуст</strong>? В этом случае <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">orElse</code> или <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">orElseThrow</code> помогут корректно обработать ситуацию с отсутствующими элементами.</p><h2 id="kak-rabotaet-filtratsiya-i-izvlechenie-dannykh" class="heading-m mb-16 mt-32">Как работает фильтрация и извлечение данных</h2><p class="text-l mt-12">Комбинация <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">filter()</code> и <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">findFirst()</code> дает возможность использовать <strong class="font-semibold">лямбда-выражения</strong> для создания сложных <strong class="font-semibold">критериев отбора</strong>, преобразуя это в несколько строк <strong class="font-semibold">ясного кода</strong>.</p><h3 id="ssylki-na-metody-i-lyambda-vyrazheniya" class="heading-xs mb-12 mt-16">Ссылки на методы и лямбда-выражения</h3><p class="text-l mt-12">Метод <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">filter()</code> принимает <strong class="font-semibold">предикат</strong> — это может быть <em class="text-l not-italic px-8 pb-2 rounded bg-brand-light">лямбда-выражение</em>, которое задает условия отбора. Для простых условий уместнее использовать <strong class="font-semibold">ссылки на методы</strong>, это более элегантное решение:</p><div class="my-16 flex"><div class="relative w-full rounded-xl border border-solid border-tetriary-base"><div class="rounded-t-xl bg-secondary-base"><div class="flex items-center justify-between px-16 py-8"><div class="caption-xs">Java</div><div><div class="flex cursor-pointer items-center gap-4 py-4 text-secondary-base hover:opacity-80"><div class="flex-none"><svg class="fill-current transition-colors" width="11" height="13" viewbox="0 0 11 13" xmlns="http://www.w3.org/2000/svg"><path d="M9 8.75C9.39844 8.75 9.75 8.42188 9.75 8V3.21875C9.75 3.125 9.70312 3.03125 9.63281 2.96094L8.03906 1.36719C7.96875 1.29688 7.875 1.25 7.78125 1.25H5.25C4.82812 1.25 4.5 1.60156 4.5 2V8C4.5 8.42188 4.82812 8.75 5.25 8.75H9ZM10.1484 2.42188C10.3594 2.63281 10.5 2.9375 10.5 3.21875V8C10.5 8.84375 9.82031 9.5 9 9.5H5.25C4.40625 9.5 3.75 8.84375 3.75 8V2C3.75 1.17969 4.40625 0.5 5.25 0.5H7.78125C8.0625 0.5 8.36719 0.640625 8.57812 0.851562L10.1484 2.42188ZM1.5 3.5H3V4.25H1.5C1.07812 4.25 0.75 4.60156 0.75 5V11C0.75 11.4219 1.07812 11.75 1.5 11.75H5.25C5.64844 11.75 6 11.4219 6 11V10.25H6.75V11C6.75 11.8438 6.07031 12.5 5.25 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5C0 4.17969 0.65625 3.5 1.5 3.5Z"/></svg></div><div class="caption-xs transition-colors">Скопировать код</div></div></div></div></div><pre class="flex overflow-y-auto px-16 py-12"><code class="lang-java">Stream.of("apple", "banana", "cherry") .filter("banana"::equals) .findFirst() .ifPresent(System.out::println); // Выведет "banana"</code></pre></div></div><p class="text-l mt-12">Если необходимо строго следовать проверке равенства, используйте <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">Objects::equals</code>:</p><div class="my-16 flex"><div class="relative w-full rounded-xl border border-solid border-tetriary-base"><div class="rounded-t-xl bg-secondary-base"><div class="flex items-center justify-between px-16 py-8"><div class="caption-xs">Java</div><div><div class="flex cursor-pointer items-center gap-4 py-4 text-secondary-base hover:opacity-80"><div class="flex-none"><svg class="fill-current transition-colors" width="11" height="13" viewbox="0 0 11 13" xmlns="http://www.w3.org/2000/svg"><path d="M9 8.75C9.39844 8.75 9.75 8.42188 9.75 8V3.21875C9.75 3.125 9.70312 3.03125 9.63281 2.96094L8.03906 1.36719C7.96875 1.29688 7.875 1.25 7.78125 1.25H5.25C4.82812 1.25 4.5 1.60156 4.5 2V8C4.5 8.42188 4.82812 8.75 5.25 8.75H9ZM10.1484 2.42188C10.3594 2.63281 10.5 2.9375 10.5 3.21875V8C10.5 8.84375 9.82031 9.5 9 9.5H5.25C4.40625 9.5 3.75 8.84375 3.75 8V2C3.75 1.17969 4.40625 0.5 5.25 0.5H7.78125C8.0625 0.5 8.36719 0.640625 8.57812 0.851562L10.1484 2.42188ZM1.5 3.5H3V4.25H1.5C1.07812 4.25 0.75 4.60156 0.75 5V11C0.75 11.4219 1.07812 11.75 1.5 11.75H5.25C5.64844 11.75 6 11.4219 6 11V10.25H6.75V11C6.75 11.8438 6.07031 12.5 5.25 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5C0 4.17969 0.65625 3.5 1.5 3.5Z"/></svg></div><div class="caption-xs transition-colors">Скопировать код</div></div></div></div></div><pre class="flex overflow-y-auto px-16 py-12"><code class="lang-java">Stream.of("apple", null, "cherry") .filter(Objects::nonNull) .filter(fruit -> Objects.equals(fruit, "banana")) .findFirst() .ifPresent(System.out::println); // Успешно найдет "banana"</code></pre></div></div><p class="text-l mt-12">Учтите, что синтаксис лямбда-выражений может немного меняться: например, скобки вокруг единственного параметра не всегда необходимы.</p><h3 id="obrabotka-prizrachnykh-elementov-pustykh-i-null" class="heading-xs mb-12 mt-16">Обработка «призрачных» элементов: пустых и Null</h3><p class="text-l mt-12">Работая с <strong class="font-semibold">потоками данных</strong>, в которых могут встретиться <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">null</code> или даже полностью отсутствовать подходящие элементы, важно составить такой код, который будет <strong class="font-semibold">безошибочно работать с null</strong> и отлично справятся с исключениями:</p><div class="my-16 flex"><div class="relative w-full rounded-xl border border-solid border-tetriary-base"><div class="rounded-t-xl bg-secondary-base"><div class="flex items-center justify-between px-16 py-8"><div class="caption-xs">Java</div><div><div class="flex cursor-pointer items-center gap-4 py-4 text-secondary-base hover:opacity-80"><div class="flex-none"><svg class="fill-current transition-colors" width="11" height="13" viewbox="0 0 11 13" xmlns="http://www.w3.org/2000/svg"><path d="M9 8.75C9.39844 8.75 9.75 8.42188 9.75 8V3.21875C9.75 3.125 9.70312 3.03125 9.63281 2.96094L8.03906 1.36719C7.96875 1.29688 7.875 1.25 7.78125 1.25H5.25C4.82812 1.25 4.5 1.60156 4.5 2V8C4.5 8.42188 4.82812 8.75 5.25 8.75H9ZM10.1484 2.42188C10.3594 2.63281 10.5 2.9375 10.5 3.21875V8C10.5 8.84375 9.82031 9.5 9 9.5H5.25C4.40625 9.5 3.75 8.84375 3.75 8V2C3.75 1.17969 4.40625 0.5 5.25 0.5H7.78125C8.0625 0.5 8.36719 0.640625 8.57812 0.851562L10.1484 2.42188ZM1.5 3.5H3V4.25H1.5C1.07812 4.25 0.75 4.60156 0.75 5V11C0.75 11.4219 1.07812 11.75 1.5 11.75H5.25C5.64844 11.75 6 11.4219 6 11V10.25H6.75V11C6.75 11.8438 6.07031 12.5 5.25 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5C0 4.17969 0.65625 3.5 1.5 3.5Z"/></svg></div><div class="caption-xs transition-colors">Скопировать код</div></div></div></div></div><pre class="flex overflow-y-auto px-16 py-12"><code class="lang-java">Stream.of("apple", null, "cherry") .filter(Objects::nonNull) .filter(fruit -> fruit.contains("b")) .findFirst() .orElseThrow(() -> new NoSuchElementException("Выброшено исключение из-за отсутствия искомого фрукта")); // В случае ошибки будет выброшено исключение</code></pre></div></div><h3 id="poryadok-dannykh-v-potokakh-i-vozmozhnaya-putanitsa" class="heading-xs mb-12 mt-16">Порядок данных в потоках и возможная путаница</h3><p class="text-l mt-12">В потоках данных, сформированных из коллекций с неупорядоченной структурой, таких как <code class="custom-scrollbar inline-flex max-w-full overflow-auto whitespace-nowrap break-words rounded bg-brand-light p-4 text-vienna">HashSet</code>, определение "первого" элемента может встретить трудности. Учитывая это, для детерминированного поиска применяется <strong class="font-semibold">сортировка</strong>:</p><div class="my-16 flex"><div class="relative w-full rounded-xl border border-solid border-tetriary-base"><div class="rounded-t-xl bg-secondary-base"><div class="flex items-center justify-between px-16 py-8"><div class="caption-xs">Java</div><div><div class="flex cursor-pointer items-center gap-4 py-4 text-secondary-base hover:opacity-80"><div class="flex-none"><svg class="fill-current transition-colors" width="11" height="13" viewbox="0 0 11 13" xmlns="http://www.w3.org/2000/svg"><path d="M9 8.75C9.39844 8.75 9.75 8.42188 9.75 8V3.21875C9.75 3.125 9.70312 3.03125 9.63281 2.96094L8.03906 1.36719C7.96875 1.29688 7.875 1.25 7.78125 1.25H5.25C4.82812 1.25 4.5 1.60156 4.5 2V8C4.5 8.42188 4.82812 8.75 5.25 8.75H9ZM10.1484 2.42188C10.3594 2.63281 10.5 2.9375 10.5 3.21875V8C10.5 8.84375 9.82031 9.5 9 9.5H5.25C4.40625 9.5 3.75 8.84375 3.75 8V2C3.75 1.17969 4.40625 0.5 5.25 0.5H7.78125C8.0625 0.5 8.36719 0.640625 8.57812 0.851562L10.1484 2.42188ZM1.5 3.5H3V4.25H1.5C1.07812 4.25 0.75 4.60156 0.75 5V11C0.75 11.4219 1.07812 11.75 1.5 11.75H5.25C5.64844 11.75 6 11.4219 6 11V10.25H6.75V11C6.75 11.8438 6.07031 12.5 5.25 12.5H1.5C0.65625 12.5 0 11.8438 0 11V5C0 4.17969 0.65625 3.5 1.5 3.5Z"/></svg></div><div class="caption-xs transition-colors">Скопировать код</div></div></div></div></div><pre class="flex overflow-y-auto px-16 py-12"><code class="lang-java">new HashSet<>(Arrays.asList("apple", "banana", "cherry")).stream() .sorted()
推荐文章