Do czego służą interfejsy funkcyjne ObjDoubleConsumer<T>, ObjIntConsumer<T> i ObjLongConsumer<T>?
sobes.tech AI
Odpowiedź od AI
Interfejsy funkcyjne ObjDoubleConsumer<T>, ObjIntConsumer<T> i ObjLongConsumer<T> służą do reprezentowania operacji, które przyjmują jako argument obiekt określonego typu T oraz wartość prymitywną (double, int lub long odpowiednio), i nie zwracają żadnego wyniku (void).
Są to wyspecjalizowane wersje interfejsu BiConsumer<T, U>, zoptymalizowane do pracy z typami prymitywnymi, co pozwala uniknąć autoboxingu/odboxingu i związanych z tym kosztów.
Przykłady użycia:
ObjDoubleConsumer<String>: Operacja przyjmująca łańcuch znaków i wartośćdouble. Na przykład, do rejestrowania powiązania klucza tekstowego z wartością double.ObjIntConsumer<List<Integer>>: Operacja przyjmująca listę liczb całkowitych i wartośćint. Na przykład, do dodania wartościintdo listy.ObjLongConsumer<Map<UUID, String>>: Operacja przyjmująca mapę i wartośćlong. Na przykład, do aktualizacji wpisu w mapie na podstawie wartościlong.
Są często używane w strumieniach (Stream API) do wykonywania efektów ubocznych (np. wyświetlanie na konsoli, zmiana stanu obiektu/zbioru) podczas przetwarzania elementów, gdy jeden z argumentów jest obiektem, a drugi prymitywem odpowiedniego typu.
Przykład z ObjIntConsumer:
import java.util.ArrayList;
import java.util.List;
import java.util.function.ObjIntConsumer;
// Tworzymy listę
List<Integer> numbers = new ArrayList<>();
// Definiujemy `ObjIntConsumer` do dodawania int do listy
ObjIntConsumer<List<Integer>> addToList = (list, value) -> list.add(value);
// Używamy konsumenta
addToList.accept(numbers, 10);
addToList.accept(numbers, 20);
// Wyświetlamy wynik
System.out.println(numbers); // Wyjście: [10, 20]