当前位置: 首页 > news >正文

【Java知识】java基础-lambda语法详细说明

Lambda语法

    • 语法说明
      • 基本语法
      • 组成部分
      • 示例
      • 注意事项
      • 使用场景
    • 使用stream api操作集合的详细说明
      • 创建 Stream
      • Stream 操作
        • 中间操作
        • 终端操作
      • 并行 Stream

语法说明

Java 中的 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数语法,它允许你以表达式的方式实现函数式接口的实例。Lambda 表达式主要用于简化集合操作和事件处理等场景。

基本语法

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

(parameters) -> expression

或者更复杂的代码块:

(parameters) -> {// 代码块
}

组成部分

  • 参数:Lambda 表达式可以没有参数,也可以有一个或多个参数。参数的类型可以显式声明,也可以省略(类型推断)。
  • 箭头:箭头 -> 将参数和 Lambda 体分开。
  • Lambda 体:Lambda 体是 Lambda 表达式的主要部分,可以是一个表达式或一个代码块。

示例

以下是一些 Lambda 表达式的示例,展示了不同类型的参数和 Lambda 体:

  1. 无参数 Lambda 表达式
Runnable runnable = () -> System.out.println("Hello, Lambda!");
runnable.run();
  1. 单个参数 Lambda 表达式
Consumer<String> consumer = (String s) -> System.out.println(s);
consumer.accept("Hello, Lambda!");
  1. 多个参数 Lambda 表达式
BinaryOperator<Integer> add = (Integer a, Integer b) -> a + b;
int result = add.apply(5, 3);
  1. 带有类型推断的 Lambda 表达式
Comparator<String> comparator = (s1, s2) -> s1.compareTo(s2);
  1. 带有代码块的 Lambda 表达式
Runnable runnable = () -> {System.out.println("Hello, Lambda!");System.out.println("Another line.");
};
runnable.run();

注意事项

  • 如果 Lambda 表达式体只有一条语句,可以省略大括号和 return 关键字(编译器会自动推断)。
  • Lambda 表达式可以捕获外围作用域中的变量(称为“闭包”),但这些变量必须是最终(final)或事实上最终的(effectively final)。
  • Lambda 表达式不能包含在 Java 中定义为抛出检查型异常的方法签名中。

使用场景

Lambda 表达式常用于以下场景:

  • 实现函数式接口的实例。
  • 作为参数传递给方法。
  • 在 Stream API 中进行集合操作。
  • 事件处理,如 GUI 编程中的事件监听器。

Lambda 表达式的引入极大地简化了 Java 的函数式编程,使得代码更加简洁和表达性更强。

使用stream api操作集合的详细说明

Java 8 引入的 Stream API 提供了一种高效且易于理解的方式来处理集合数据。Stream API 支持对集合进行多种操作,如筛选、转换、聚合等,且这些操作可以串行或并行执行。

创建 Stream

Stream 可以通过多种方式创建:

  1. 从集合创建
    任何 Java 集合(如 ListSet)都可以通过调用 stream() 方法获得 Stream。

    List<String> list = Arrays.asList("a1", "a2", "b1", "c2", "c1");
    Stream<String> stream = list.stream();
    
  2. 从值创建
    可以使用 Stream.of 方法从一组值创建 Stream。

    Stream<String> stream = Stream.of("a1", "a2", "b1", "c2", "c1");
    
  3. 使用 Stream.builder()
    可以使用 Stream.builder() 构建 Stream,并添加多个元素。

    Stream<String> stream = Stream.builder().add("a1").add("a2").add("b1").add("c2").add("c1").build();
    
  4. 从数组创建
    可以使用 Arrays.stream 方法从数组创建 Stream。

    String[] array = {"a1", "a2", "b1", "c2", "c1"};
    IntStream stream = Arrays.stream(array, 0, 3);
    
  5. 使用 Stream.generate()
    可以使用 Stream.generate 方法生成无限 Stream。

    Stream<String> stream = Stream.generate(() -> "a1").limit(3);
    

Stream 操作

Stream 操作可以分为两类:

  1. 中间操作(Intermediate operations):返回一个新的 Stream,可以进行链式操作。
  2. 终端操作(Terminal operations):产生一个最终的结果或副作用,操作后 Stream 被消耗。
中间操作
  • filter:根据条件过滤元素。

    stream.filter(s -> s.startsWith("a")).forEach(System.out::println);
    
  • map:将元素映射到另一种形式。

    stream.map(String::toUpperCase).sorted().forEach(System.out::println);
    
  • flatMap:将多个 Stream 合并成一个 Stream。

    Stream.of(Arrays.asList("a1", "a2"), Arrays.asList("b1", "c2")).flatMap(Collection::stream).forEach(System.out::println);
    
  • limit:限制 Stream 中元素的数量。

    stream.limit(3).forEach(System.out::println);
    
  • sorted:将 Stream 中的元素进行排序。

    stream.sorted().forEach(System.out::println);
    
终端操作
  • forEach:对每个元素执行操作。

    stream.forEach(System.out::println);
    
  • collect:将 Stream 转换为其他形式,如集合。

    List<String> collected = stream.collect(Collectors.toList());
    
  • reduce:通过某个连接动作将所有元素汇总成一个汇总结果。

    Optional<String> reduced = stream.reduce((s1, s2) -> s1 + "#" + s2);
    
  • allMatch、anyMatch、noneMatch:检查 Stream 的元素是否与给定的谓词匹配。

    boolean allStartsWithA = stream.allMatch(s -> s.startsWith("a"));
    
  • count:返回 Stream 中元素的数量。

    long count = stream.count();
    
  • findFirst、findAny:返回 Stream 中的第一个或任意一个元素。

    Optional<String> first = stream.findFirst();
    

并行 Stream

可以通过在 Stream 上调用 parallelStream() 方法来创建一个并行 Stream,它允许操作在多个线程上并行执行。

List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");
myList.parallelStream().filter(s -> s.startsWith("a")).map(String::toUpperCase).sorted().forEach(System.out::println);

使用 Stream API 操作集合可以极大地提高代码的可读性和开发效率,同时它也为并行处理提供了便利。


http://www.mrgr.cn/news/68221.html

相关文章:

  • leetcode138:随机链表的复制
  • 反转链表(Leetcode)
  • MetaGeneMark:宏转录组转录本基因预测
  • 2024年三个月自学手册 网络安全(黑客技术)
  • 牛客sql题目总结(1)
  • Java 网络编程(一)—— UDP数据报套接字编程
  • 14.C++ 特殊类与设计模式
  • C++ 的发展
  • 青少年编程与数学 02-003 Go语言网络编程 16课题、Go语言RPC编程
  • Java集合框架之List接口
  • Halcon刚性变换
  • go语言解决rtsp协议只播放部分的问题(业务问题)
  • Android 读取内部文件
  • C++ 标准模板库 (STL)- 高效学习推荐
  • React 中 `key` 属性的警告及其解决方案
  • 初三数学,最优解问题
  • [241108] AMD 开源首批 10 亿参数语言模型:AMD OLMo | Xfce 4.20 Pre1发布
  • 【Linux系列】字符串操作的艺术:删除前缀的 Shell 脚本技巧
  • AI 浅探,揭秘【AI开发流程】的奥秘
  • Java | Leetcode Java题解之第546题移除盒子
  • 高级java每日一道面试题-2024年10月30日-JVM篇-新生代垃圾回收器和老生代垃圾回收器有哪些?有什么区别?
  • 如何实现低代码接口?低代码平台接口开发详解
  • 解决警告:Boxed value is unboxed and then immediately reboxed
  • C++:模拟实现STL的list
  • 鸿蒙NEXT开发笔记(十二)仿微信聊天App的图片转BASE64串
  • Nginx 配置文件详解