Вопросы для собеседования по Java (серия) — лямбда-выражения

Чем меньше, тем лучше, когда дело доходит до Java! 💯

Краткий

Отслеживание предыдущий постсегодня мы рассмотрим:

🔸 Что такое lambda expression?

🔸 Отношения между lambda а также Functional Interfaces

🔸 Отношения между lambda а также Streams

🔸 Примеры реализации.

Реализация

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

Основным преимуществом этого является то, что он сокращает объем кода, необходимого для обеспечения реализации.

Давайте посмотрим, как вы можете это сделать! 👀

1️⃣ Во-первых, вам понадобится функциональный интерфейс. Если вы хотите лучше понять, что это такое и как это работает, ознакомьтесь с эта почта!

@FunctionalInterface
public interface Accumulator {
    int add(int x, int y);
}

Аккумулятор.java

2️⃣ Реализовать интерфейс.

Посмотрите больше подобных сообщений на new-spike.net! 🚀

Примечание

До Java 8, если вы не хотели иметь отдельный класс, реализующий ваш интерфейс, вы могли сделать это с помощью анонимного класса.

int x = 10;
  int y = 15;
  
  // anonymous class
  Accumulator accumulator = new Accumulator() {
  	@Override
  	public int add(int x, int y) {
 		 return x + y;
  	}
  };

  int result = accumulator.add(x, y); // result = 35

Приложение.java

🚀 От Java 8 вперед вы можете реализовать функциональный интерфейс более быстрым и читаемым способом, используя лямбда-выражение.

int x = 15;
  int y = 20;
  
  // lambda expression
  Accumulator accumulator = (x1, y1) -> x1 + y1; // implementation of the interface method

  int result = accumulator.add(x,y); // result = 35

Приложение.java

Еще одно важное различие между lambda и anonymous class заключается в том, что для последнего компилятор Java фактически создает отдельный .class файл так, как это было бы для обычного класса, реализующего интерфейс.

В то время как lambda выражение рассматривается как простой метод.

Посмотрите больше подобных сообщений на new-spike.net! 🚀

🤝 Вы также обнаружите, что лямбда-выражения работают рука об руку с Streams.

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

🔹 Приведу пример.

List<Integer> inputList = new ArrayList<>();
  inputList.add(1);
  inputList.add(2);
  inputList.add(3);
  inputList.add(4);
  inputList.add(5);

  List<Integer> filteredList = inputList.stream()
    .filter(item -> item % 2 == 0) // lambda expression returning true for odd items
    .collect(Collectors.toList()); 
    
  // filteredList = { 2, 4 }

🔹 Кроме того, лямбда-блок не обязательно должен состоять только из одной строки.

List<Integer> inputList = new ArrayList<>();
  inputList.add(1);
  inputList.add(2);
  inputList.add(3);
  inputList.add(4);
  inputList.add(5);
        
  inputList.forEach(item -> {
              item++;
              System.out.println("Updated item: " + item);
          });
          
  // Result:       
  // Updated item2
  // Updated item3
  // Updated item4
  // Updated item5
  // Updated item6

Приложение.java

👍 Однако эмпирическое правило заключается в том, что если вам нужно иметь несколько строк в лямбда-выражении, извлекайте его в приватном методе.

public class Calculator {

    public static void calculate() {
    	List<Integer> inputList = new ArrayList<>();
    	inputList.add(1);
    	inputList.add(2);
    	inputList.add(3);
        inputList.add(4);
        inputList.add(5);

        inputList.forEach(item -> extracted(item));
    }

    private static void extracted(Integer item) {
        item++;
        System.out.println("Updated item: " + item);
    }
 }

🧠 Или, что еще лучше, на основе сигнатуры метода компилятор может понять, что вы пытаетесь сделать.

Это означает, что вы можете вызвать метод, просто передав имя класса вместе с именем метода.

public class Calculator {

    public static void calculate() {
    	List<Integer> inputList = new ArrayList<>();
    	inputList.add(1);
    	inputList.add(2);
    	inputList.add(3);
        inputList.add(4);
        inputList.add(5);

        inputList.forEach(Calculator::extracted); // lambda using method reference
    }

    private static void extracted(Integer item) {
        item++;
        System.out.println("Updated item: " + item);
    }
 }

Калькулятор.java

Не пропустите больше таких сообщений! Подпишитесь на нашу бесплатную рассылку!

Посмотрите больше подобных сообщений на new-spike.net! 🚀

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *