(全文目录:)

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前序

Lambda表达式是Java 8引入的一个重要特性,它改变了我们编写代码的方式,使得代码更加简洁和高效。Lambda表达式提供了函数式编程的风格,使得处理集合、事件监听等任务更加方便。通过Lambda表达式,我们能够以更简洁的方式表达对行为的操作,尤其在集合操作中发挥了巨大的优势。

今天,我们将一起探讨Lambda表达式的语法和使用方法,深入了解函数式接口与@FunctionalInterface注解的概念,最后演示如何通过Lambda表达式来简化集合操作。


前言

你是否曾经觉得Java代码中的匿名内部类十分冗长和难以理解?尤其是在处理事件监听、线程、集合等操作时,匿名内部类的代码往往显得重复和臃肿。幸运的是,Java 8通过引入Lambda表达式为我们提供了一个更加简洁的解决方案,让我们的代码变得更加清晰、简洁。

今天我们会一起深入学习Lambda表达式,从语法到应用,再到如何通过Lambda表达式简化集合操作。掌握这些内容,你将能够编写更加高效且易于维护的Java代码。


第一部分:Lambda表达式的语法与使用

1.1 Lambda表达式的基本语法

Lambda表达式的基本语法形式如下:

(parameters) -> expression

其中:

  • parameters 是传入Lambda表达式的参数,类型可以省略(由编译器推断)。
  • -> 是Lambda操作符,用于将参数与表达式分开。
  • expression 是Lambda表达式的主体,它可以是一个简单的表达式,也可以是一个代码块。

示例:

public class LambdaExample {public static void main(String[] args) {// Lambda表达式:无参数,返回一个固定的值Runnable run = () -> System.out.println("Hello from Lambda!");run.run();}
}

解释:

  • Runnable 接口只有一个 run() 方法,Lambda表达式 () -> System.out.println("Hello from Lambda!") 实现了该方法。

1.2 带参数的Lambda表达式

Lambda表达式可以接受一个或多个参数。参数的类型可以由编译器推断,也可以显式指定。

示例:

public class LambdaExample {public static void main(String[] args) {// 带一个参数的Lambda表达式MyFunction printMessage = (message) -> System.out.println(message);printMessage.apply("Hello, Lambda!");}// 定义一个函数式接口@FunctionalInterfaceinterface MyFunction {void apply(String message);}
}

解释:

  • MyFunction 是一个函数式接口,它有一个抽象方法 apply,Lambda表达式 (message) -> System.out.println(message) 实现了该方法。

1.3 Lambda表达式中的代码块

当Lambda表达式需要执行多行代码时,可以使用代码块。

示例:

public class LambdaExample {public static void main(String[] args) {// Lambda表达式中的代码块MyFunction printMessages = (message) -> {System.out.println("Start of message");System.out.println(message);System.out.println("End of message");};printMessages.apply("Hello, Lambda!");}
}

解释:

  • 在这个例子中,Lambda表达式包含了多个语句,因此我们使用了花括号 {} 来表示代码块。

第二部分:函数式接口与@FunctionalInterface注解

2.1 函数式接口的定义

函数式接口是只包含一个抽象方法的接口。它是支持Lambda表达式的关键,Java 8中引入了对Lambda表达式的支持,使得函数式接口成为函数式编程的基础。

示例:

@FunctionalInterface
interface MyFunctionalInterface {void myMethod();  // 这是唯一的抽象方法// 可以有其他方法(非抽象方法)default void anotherMethod() {System.out.println("This is a default method.");}static void staticMethod() {System.out.println("This is a static method.");}
}

解释:

  • MyFunctionalInterface 是一个函数式接口,它只有一个抽象方法 myMethod(),但是我们也可以在接口中定义默认方法 (default) 和静态方法 (static)。

2.2 @FunctionalInterface注解

@FunctionalInterface 是一个标识性注解,告诉编译器该接口是一个函数式接口。如果该接口包含多个抽象方法,编译器会报错。这个注解不是强制性的,但它能帮助我们确保接口遵循函数式接口的规则。

示例:

@FunctionalInterface
interface MyFunctionalInterface {void performAction();// 编译错误:函数式接口不能有多个抽象方法// void anotherAction();
}

解释:

  • 如果我们在接口中定义了多个抽象方法,编译器会报错,提示该接口不符合函数式接口的规范。

第三部分:使用Lambda简化集合操作

Lambda表达式的引入大大简化了集合操作,尤其是在使用Stream API时,它使得对集合的操作变得更加简洁和高效。我们将通过示例来展示如何使用Lambda表达式来简化集合操作。

3.1 使用forEach方法遍历集合

forEach方法是Iterable接口的默认方法,它允许我们使用Lambda表达式遍历集合中的元素。

示例:

import java.util.Arrays;
import java.util.List;public class LambdaExample {public static void main(String[] args) {List<String> languages = Arrays.asList("Java", "Python", "JavaScript", "C++");// 使用Lambda表达式遍历集合languages.forEach(language -> System.out.println(language));}
}

解释:

  • 使用forEach方法和Lambda表达式,我们可以遍历languages集合并输出每个元素。

3.2 使用Stream API进行过滤和映射

Stream API结合Lambda表达式,使得集合的过滤、转换等操作变得更加简洁。

示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaExample {public static void main(String[] args) {List<String> languages = Arrays.asList("Java", "Python", "JavaScript", "C++", "Java");// 使用Stream和Lambda进行过滤和映射List<String> filteredLanguages = languages.stream().filter(language -> language.startsWith("J"))  // 过滤以"J"开头的语言.collect(Collectors.toList());System.out.println(filteredLanguages);  // 输出:[Java, JavaScript, Java]}
}

解释:

  • filter方法通过Lambda表达式过滤出以"J"开头的语言。
  • collect(Collectors.toList())将过滤后的结果收集到一个新的列表中。

3.3 使用map方法进行转换

map方法用于将集合中的每个元素映射到另一个元素。在Lambda表达式的帮助下,这种操作变得更加简洁。

示例:

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaExample {public static void main(String[] args) {List<String> languages = Arrays.asList("Java", "Python", "JavaScript");// 使用map将每个元素转换为大写List<String> upperCaseLanguages = languages.stream().map(String::toUpperCase).collect(Collectors.toList());System.out.println(upperCaseLanguages);  // 输出:[JAVA, PYTHON, JAVASCRIPT]}
}

解释:

  • map方法通过String::toUpperCase将每个元素转换为大写字母。

总结

Lambda表达式的引入使得Java语言变得更加简洁和高效,特别是在集合操作和函数式编程方面。通过Lambda表达式,我们可以更优雅地遍历集合、进行过滤、转换以及进行其他操作。

在学习Lambda表达式时,了解函数式接口及其使用是关键。此外,掌握Stream API、forEachmapfilter等方法,可以帮助你在实际开发中写出更加简洁、易于维护的代码。

通过Lambda表达式,你可以让代码更加简洁高效,同时提高程序的可读性和可维护性!

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。 ⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!