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

Lambda表达式的高级用法

今天来分享下Java的Lambda表达式,以及它的高级用法。

使用它可以提高代码的简洁度,使代码更优雅。

一、什么是lambda表达式

Lambda 表达式是 Java 8 引入的特性,用于简化匿名内部类的语法,使代码更简洁,尤其在处理函数式接口时。

二、Lambda表达式的12个高级用法

1. 集合遍历(foreach)

  • 普通写法
List<String> names = Arrays.asList("Alice", "Bob");
for(String name : names){System.out.println(name);
}
  • 优雅写法1
List<String> names = Arrays.asList("Alice", "Bob");
names.forEach(name -> System.out.println(name));
  • 优雅写法2
names.forEach(System.out::println);

2. 条件过滤(filter)

  • 传统写法
List<String> filtered = new ArrayList<>();
for (String s : list) {if (s.startsWith("A")) {filtered.add(s);}
}
  • 优雅写法
List<String> filtered = list.stream().filter(s -> s.startsWith("A")).collect(Collectors.toList());

3. 映射转换(map)

  • 普通写法
List<String> names = Arrays.asList("Alice", "Bob");
List<Person> people = new ArrayList<>();
for (String name : names) {people.add(new Person(name));
}
  • 优雅写法
List<Person> people = names.stream().map(Person::new).collect(Collectors.toList());

4. 分组统计(groupingBy)

  • 普通写法
Map<String, List<Person>> peopleByCity = new HashMap<>();
for (Person person : people) {String city = person.getCity();if (!peopleByCity.containsKey(city)) {peopleByCity.put(city, new ArrayList<>());}peopleByCity.get(city).add(person);
}
  • 优雅写法
Map<String, List<Person>> peopleByCity = people.stream().collect(Collectors.groupingBy(Person::getCity));

5. 求和(reduce)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3);
int sum = 0;
for (Integer n : nums) {sum += n;
}
  • 优雅写法
int sum = nums.stream().reduce(0, (a, b) -> a + b);

6. 排序(Comparator)

  • 普通写法
List<String> names = Arrays.asList("Bob", "Alice");
Collections.sort(names, new Comparator<String>() {@Overridepublic int compare(String a, String b) {return a.compareTo(b);}
});
  • 优雅写法1
names.sort((a, b) -> a.compareTo(b));
// 或方法引用:
  • 优雅写法2
names.sort(String::compareTo);

7. 替代匿名内部类(Runnable)

  • 普通写法
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Thread running");}
}).start();
  • 优雅写法
new Thread(() -> System.out.println("Thread running")).start();

8. 链式操作(多条件处理)

  • 普通写法
List<String> result = new ArrayList<>();
for (String name : names) {if (name.startsWith("A")) {result.add(name.toUpperCase());}
}
  • 优雅写法
names.stream().filter(name - > name.startsWith("A")).map(String::toUpperCase).collect(Collectors.toList());

9. 并行流处理(Parallel)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3);ExecutorService executor = Executors.newFixedThreadPool(2);
for (Integer n : nums) {executor.submit(() -> process(n));
}
executor.shutdown();
  • 优雅写法
nums.parallelStream().forEach(n -> process(n));

10. 自定义函数式接口

  • 普通写法
// 定义函数式接口
@FunctionalInterface
interface MathOperation {int operate(int a, int b);
}MathOperation add = new MathOperation() {@Overridepublic int operate(int a, int b) {return a + b;}
};
  • 优雅写法
MathOperation add = (a, b) -> a + b;
MathOperation multiply = (a, b) -> a * b;

11. optional的链式操作

  • 普通写法
Optional<String> optional = Optional.of("test");if (optional.isPresent()) {String value = optional.get();System.out.println(value.toUpperCase());
}
  • 优雅写法
optional.map(String::toUpperCase).ifPresent(System.out::println);

12. 谓词组合(Predicate.and/or)

  • 普通写法
List<Integer> nums = Arrays.asList(1, 2, 3, 4);List<Integer> filtered = new ArrayList<>();
for (Integer n : nums) {if (n > 1 && n < 4) {filtered.add(n);}
}
  • 优雅写法
Predicate<Integer> greaterThan1 = n -> n > 1;
Predicate<Integer> lessThan4 = n -> n < 4;
List<Integer> filtered = nums.stream().filter(greaterThan1.and(lessThan4)).collect(Collectors.toList());
http://www.xdnf.cn/news/7712.html

相关文章:

  • RPC 协议详解、案例分析与应用场景
  • Ubuntu部署私有Gitlab
  • 【MySQL】联合查询(上)
  • 详解鸿蒙仓颉开发语言中的日志打印问题
  • Go语言内存共享与扩容机制 -《Go语言实战指南》
  • 软考 系统架构设计师系列知识点之杂项集萃(67)
  • 【 Redis | 实战篇 扩展 】
  • 在 VB6 中强制设置 Word 文档的纸张尺寸
  • 策略的组合与叠加多策略联合交易
  • 阿里云域名 绑定 华为云服务器ip
  • 自定义协议与序列反序列化
  • FPGA开发全流程
  • 每日算法刷题计划Day12 5.21:leetcode不定长滑动窗口求最短/最长3道题,,用时1h40min(有点长了)
  • 《大模型开源与闭源的深度博弈:科技新生态下的权衡与抉择》
  • 零基础教程:用 Docker + pgloader 将 MySQL 数据库迁移到 PostgreSQL
  • 如何在 Android 手机和平板电脑上下载应用程序
  • 【压型机通信瓶颈破解】Profinet转RS485协议转换,如何提升设备联动效率?
  • Axure高级交互设计:中继器嵌套动态面板实现超强体验感台账
  • SpringMVC 通过ajax 实现文件的上传
  • 嵌入式开发学习日志(linux系统编程--文件读写函数(2))Day24
  • 【面经分享】微派网络一面
  • vue3中RouterView配合KeepAlive实现组件缓存
  • 告别格式壁垒:用迪威模型实现 MMD 模型到 STP 的几何精准转换(附复杂发型处理技巧)
  • 九天画芯CEO张锦:AR 与 AI 融合重构智能终端生态,消费级市场迎来关键拐点
  • MCU 上电不启动的常见原因分析与排查思路
  • 2024年下半年软考系统架构设计师案例分析题
  • 【Leetcode 每日一题】3356. 零数组变换 II
  • Memory模块是agent的一个关键组件
  • 工业视觉缺陷检测的算法总结
  • SpringBoot JAR 启动原理