Lambda表达式的高级用法

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

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

一、什么是lambda表达式

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

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

1. 集合遍历(foreach)

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

2. 条件过滤(filter)

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

3. 映射转换(map)

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

4. 分组统计(groupingBy)

  • 普通写法
java 复制代码
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);
}
  • 优雅写法
java 复制代码
在Map<String, List<Person>> peopleByCity = people.stream().collect(Collectors.groupingBy(Person::getCity));

5. 求和(reduce)

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

6. 排序(Comparator)

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

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

  • 普通写法
java 复制代码
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread running");
    }
}).start();
  • 优雅写法
java 复制代码
new Thread(() -> System.out.println("Thread running")).start();

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

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

9. 并行流处理(Parallel)

  • 普通写法
java 复制代码
List<Integer> nums = Arrays.asList(1, 2, 3);

ExecutorService executor = Executors.newFixedThreadPool(2);
for (Integer n : nums) {
    executor.submit(() -> process(n));
}
executor.shutdown();
  • 优雅写法
java 复制代码
nums.parallelStream().forEach(n -> process(n));

10. 自定义函数式接口

  • 普通写法
java 复制代码
// 定义函数式接口
@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

MathOperation add = new MathOperation() {
    @Override
    public int operate(int a, int b) {
        return a + b;
    }
};
  • 优雅写法
java 复制代码
MathOperation add = (a, b) -> a + b;
MathOperation multiply = (a, b) -> a * b;

11. optional的链式操作

  • 普通写法
java 复制代码
Optional<String> optional = Optional.of("test");

if (optional.isPresent()) {
    String value = optional.get();
    System.out.println(value.toUpperCase());
}
  • 优雅写法
java 复制代码
optional.map(String::toUpperCase)
	.ifPresent(System.out::println);

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

  • 普通写法
java 复制代码
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);
    }
}
  • 优雅写法
java 复制代码
Predicate<Integer> greaterThan1 = n -> n > 1;
Predicate<Integer> lessThan4 = n -> n < 4;
List<Integer> filtered = nums.stream()
                            .filter(greaterThan1.and(lessThan4))
                            .collect(Collectors.toList());
相关推荐
fengfuyao9856 分钟前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab
★YUI★10 分钟前
学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17
java·学习·游戏·unity·c#
微小的xx13 分钟前
java + html 图片点击文字验证码
java·python·html
CHANG_THE_WORLD23 分钟前
# C++ 中的 `string_view` 和 `span`:现代安全视图指南
开发语言·c++
雨落倾城夏未凉23 分钟前
9.c++new申请二维数组
c++·后端
mask哥25 分钟前
详解flink java基础(一)
java·大数据·微服务·flink·实时计算·领域驱动
二闹26 分钟前
后端的请求体你选对了吗?
后端
克拉克盖博43 分钟前
chapter03_Bean的实例化与策略模式
java·spring·策略模式
Franklin1 小时前
Python界面设计【QT-creator基础编程 - 01】如何让不同分辨率图像自动匹配graphicsView的窗口大小
开发语言·python·qt
lichenyang4531 小时前
Mongodb(文档数据库)的安装与使用(文档的增删改查)
后端