专业编程基础技术教程

网站首页 > 基础教程 正文

Java 中的 Lambda 表达式

ccvgpt 2024-08-04 12:07:32 基础教程 10 ℃

让我们了解一下 lambda

嘿开发者!!! 我想出了另一篇基于 Java 的文章,它实际上与 Java 8 特性相关……它是 Lambda 表达式! 你知道他们吗? 实际上,它是作为对 Java 中匿名内部类的进一步增强而引入的。

Java 中的 Lambda 表达式

那么什么是匿名内部类? 没有名称的类称为匿名内部类。 您可以在下面看到一个示例。 Java 线程使用 Runnable 接口提供此实现。

public class LambdaDemo {

    public static void main(String[] args) {

        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                System.out.println("Thread created");
            }
        }).start();

    }
}

当我们需要并且没有类名时,我们正在旅途中实现这些方法。否则我们无法从 Java 中的接口创建实例!当我打算做这几个接口时,很明显代码会变得混乱。所以,Java 使用 lambda 表达式对此进行了某种增强。它肯定会减少代码行数。


Lambda 表达式

Lambda 表达式基于函数式接口。

只包含一种方法(抽象方法)的接口被认为是功能接口。

因此,每当我们使用具有唯一方法的接口时,我们都可以在代码中使用该接口的任何地方使用 lambda 表达式。

请记住,除了唯一的抽象方法之外,任何功能接口都可以有更多方法。从 Java 8 开始,我们可以在任何接口中使用默认方法和静态方法。

Java 在内部实现中使用注解,以确保所需的接口被声明为功能接口。该注释称为@FunctionalInterface。你可以进入 Java 中的 Runnable 接口看到这个注解。它会像这样显示。

@FunctionalInterface
public interface Runnable {
    void run();
}

无论如何,这个注释是可选的。 如果我们使用它,它将不允许我们在编译时违反该接口的规则。

和 Runnable 接口一样,Java 也有另一套函数式接口……

  • 带有测试方法的谓词接口——用于 Java 流过滤方法。
  • 带有 accept 方法的消费者接口 — 用于 Java 集合中的 forEach 方法。
  • 带有 get 方法的供应商接口——用于返回不带参数的结果。


lambda 表达式的格式

(参数)-> { body } 或

( ) -> 正文


Lambda 的优势……

  1. 启用将功能视为方法参数(我们稍后会看到)
  2. 它可以在我们想要的任何时候轻松地与实现一起使用
  3. 减少代码行数


让我们看看如何使用 lambda 表达式……

Java 集合方法称为 forEach 以循环遍历元素。 让我们将此方法与 Lambda 一起使用。 它以消费者方法作为参数。

List<String> names = Arrays.asList("Sam", "Bob", "Sim");
names.forEach(number -> System.out.print(number + " "));

Java 流过滤器方法也将 Predicate 作为参数。

Predicate<String> predicate = name -> name.startsWith("S");
List<String> namesWithLetter = names.stream()
        .filter(predicate)
        .collect(Collectors.toList());
System.out.println(namesWithLetter);

也可以使用 lambda 覆盖 Java 线程运行方法。

Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
Thread thread = new Thread(runnable);
thread.start();

Java 供应商接口 get 方法也可以使用 lambda 覆盖。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Supplier<String> s1 = () -> dtf.format(LocalDateTime.now());
String time = s1.get();
System.out.println("Formatted Time: " + time);

在下面找到我使用了上述所有方法的 Java 代码片段。

public class LambdaDemo {
    public static void main(String[] args) {
        // CREATE SEPARATE CONSUMER TO MAKE STRINGS UPPERCASE
        List<String> names = Arrays.asList("Sam", "Bob", "Sim");
        // APPLY LAMBDA
        names.forEach(number -> System.out.print(number + " "));
        // APPLY LAMBDA WITH METHOD REFERENCE
        names.forEach(System.out::println);

        // CONSUMER "ACCEPT" METHOD IMPLEMENTATION
        Consumer<String> changeCase = a -> System.out.println(a.toUpperCase());
        // PASS LAMBDA AS A METHOD ARGUMENT
        names.forEach(changeCase);

        // PREDICATE "TEST" METHOD IMPLEMENTATION
        Predicate<String> predicate = name -> name.startsWith("S");
        // PROCESS DATA WITH FILTER
        List<String> namesWithLetter = names.stream().filter(predicate).collect(Collectors.toList());
        // PASS LAMBDA AS A METHOD ARGUMENT
        System.out.println(namesWithLetter);

        // RUNNABLE "RUN" METHOD IMPLEMENTATION
        Runnable runnable = () -> System.out.println(Thread.currentThread().getName());
        // PASS LAMBDA AS A OBJECT TO THE CONSTRUCTOR
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

现在我们已经到了本文的结尾,伙计们! 我在 Lambda 表达式方面的知识尽可能多地包含在这里。 所以试着仔细阅读并抓住概念..

稍后我将返回另一篇关于 Java 的文章。直到那时,

大家再见!

最近发表
标签列表