Consumer
/*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.util.function;
import java.util.Objects;
/**
* Represents an operation that accepts a single input argument and returns no
* result. Unlike most other functional interfaces, {@code Consumer} is expected
* to operate via side-effects.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #accept(Object)}.
*
* @param <T> the type of the input to the operation
*
* @since 1.8
*/
@FunctionalInterface
public interface Consumer<T> {
/**
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);
/**
* Returns a composed {@code Consumer} that performs, in sequence, this
* operation followed by the {@code after} operation. If performing either
* operation throws an exception, it is relayed to the caller of the
* composed operation. If performing this operation throws an exception,
* the {@code after} operation will not be performed.
*
* @param after the operation to perform after this operation
* @return a composed {@code Consumer} that performs in sequence this
* operation followed by the {@code after} operation
* @throws NullPointerException if {@code after} is null
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
интерфейс Consumer<T>
из пакета java.util.function
. Этот интерфейс является частью Java 8 и используется для работы с функциональными интерфейсами.
Общая структура
- Авторские права и лицензия:
- В начале файла содержится информация об авторских правах и лицензии. Это стандартная практика для открытого программного обеспечения, чтобы указать, кто является владельцем прав на код и при каких условиях его можно использовать.
-
В данном случае код распространяется под лицензией GNU General Public License версии 2, что позволяет пользователям свободно использовать, изменять и распространять код, при условии соблюдения условий лицензии.
-
Пакет:
java package java.util.function;
-
Указывает, что этот интерфейс находится в пакете
java.util.function
, который содержит функциональные интерфейсы, используемые в Java. -
Аннотация
@FunctionalInterface
: - Эта аннотация указывает, что интерфейс является функциональным, то есть он содержит ровно один абстрактный метод. Это позволяет использовать его в контексте лямбда-выражений.
Описание интерфейса Consumer<T>
public interface Consumer<T> {
- Интерфейс
Consumer
представляет операцию, которая принимает один входной аргумент типаT
и не возвращает никакого результата. Он предназначен для выполнения операций с побочными эффектами, например, для изменения состояния объекта или вывода данных.
Метод accept
void accept(T t);
- Это основной метод интерфейса, который принимает один аргумент типа
T
. Он не возвращает значения (возвращаемый типvoid
), что означает, что его основная цель — выполнить какое-то действие с переданным аргументом.
Метод andThen
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
- Этот метод позволяет создать новый
Consumer
, который сначала выполняет текущую операцию, а затем выполняет операцию, переданную в качестве аргументаafter
. - Если выполнение одной из операций вызывает исключение, оно будет передано вызывающему коду. Если текущая операция вызывает исключение, операция
after
не будет выполнена. - Метод принимает другой
Consumer
и возвращает новыйConsumer
, который выполняет обе операции последовательно.
Пример использования Consumer
Вот пример, как можно использовать интерфейс Consumer
:
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
// Создаем Consumer, который выводит строку на экран
Consumer<String> printConsumer = s -> System.out.println(s);
// Создаем другой Consumer, который добавляет "!" к строке и выводит
Consumer<String> excitedConsumer = s -> System.out.println(s + "!");
// Составляем два Consumer
Consumer<String> combinedConsumer = printConsumer.andThen(excitedConsumer);
// Применяем составленный Consumer
combinedConsumer.accept("Hello"); // Вывод: Hello
// Hello!
}
}
Разбор примера
- Создание
Consumer
: - Мы создаем
Consumer
, который принимает строку и выводит ее на экран. -
Затем создаем другой
Consumer
, который добавляет восклицательный знак к строке и также выводит ее. -
Составление
Consumer
: -
Мы используем метод
andThen
, чтобы создать новыйConsumer
, который сначала выполняетprintConsumer
, а затемexcitedConsumer
. -
Применение
Consumer
: - Вызов
combinedConsumer.accept("Hello")
сначала выводит "Hello", а затем "Hello!".
Заключение
Интерфейс Consumer<T>
является мощным инструментом для работы с функциональными интерфейсами в Java. Он позволяет создавать операции, которые могут быть легко комбинированы и использованы в различных контекстах, что делает код более чистым и выразительным.
[[Wildcard]]