Назад к вопросам
Junior
80
questionbank

Что делает метод peek()?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Метод peek() в Java используется для выборки элементов из различных коллекций, не удаляя их. Его поведение зависит от интерфейса или класса, в котором он определен.

В контексте Java SE, peek() обычно применяется:

  1. В интерфейсе Deque (и его реализациях, таких как ArrayDeque, LinkedList): Возвращает верхний (первый) элемент дека, но не удаляет его. Если дек пуст, возвращает null.

    // Пример использования peek() для Deque
    import java.util.Deque;
    import java.util.ArrayDeque;
    
    public class DequePeekExample {
        public static void main(String[] args) {
            Deque<String> deque = new ArrayDeque<>();
            deque.offerLast("Element 1");
            deque.offerLast("Element 2");
    
            String firstElement = deque.peek(); // Возвращает "Element 1", не удаляя его
    
            System.out.println("First element: " + firstElement); // Output: First element: Element 1
            System.out.println("Deque after peek: " + deque);    // Output: Deque after peek: [Element 1, Element 2]
        }
    }
    
  2. В интерфейсе Queue (и его реализациях, таких как LinkedList, PriorityQueue): Возвращает головной (первый) элемент очереди, но не удаляет его. Если очередь пуста, возвращает null.

    // Пример использования peek() для Queue
    import java.util.Queue;
    import java.util.LinkedList;
    
    public class QueuePeekExample {
        public static void main(String[] args) {
            Queue<Integer> queue = new LinkedList<>();
            queue.offer(10);
            queue.offer(20);
    
            Integer headElement = queue.peek(); // Возвращает 10, не удаляя его
    
            System.out.println("Head element: " + headElement); // Output: Head element: 10
            System.out.println("Queue after peek: " + queue);    // Output: Queue after peek: [10, 20]
        }
    }
    
  3. В потоках (Streams) с промежуточной операцией peek(): Выполняет действие над каждым элементом потока, не влияя на его содержимое. Используется в основном для отладки или логирования, позволяя "подсмотреть" элементы по мере их прохождения через конвейер.

    // Пример использования peek() в Streams
    import java.util.stream.Stream;
    
    public class StreamPeekExample {
        public static void main(String[] args) {
            Stream.of("a", "b", "c")
                  .peek(s -> System.out.println("Processing: " + s)) // Выполняет действие для каждого элемента
                  .map(String::toUpperCase)
                  .forEach(System.out::println);
        }
    }
    

Основные характеристики peek():

  • Не модифицирует коллекцию/поток: В отличие от методов вроде poll() или remove(), peek() только просматривает элемент.
  • Возвращает null: Для коллекций, если они пусты, peek() возвращает null (в отличие от element(), который бросает исключение NoSuchElementException).
  • Ленивый в Streams: В потоках операция peek() является промежуточной и выполняется только тогда, когда потоковый конвейер завершается терминальной операцией.

Таким образом, peek() предоставляет безопасный способ проверить следующий доступный элемент без его извлечения.