Lambda 表达式

一、Lambda 表达式简介

Lambda 表达式是一种简洁的函数式编程方式,用于实现只有一个方法的接口(例如函数式接口)。

基本语法

java 复制代码
(parameters) -> expression
(parameters) -> { statements; }
  • 参数:可以有零个或多个参数。
  • 箭头操作符 (->):将参数与函数体分隔开。
  • 函数体:可以是单行表达式,也可以是包含多行语句的代码块。

示例

1. 使用匿名
java 复制代码
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("传统方式:Hello World!");
    }
};
new Thread(runnable).start();
2. 使用 Lambda 表达式
java 复制代码
Runnable runnable = () -> System.out.println("Lambda 表达式:Hello World!");
new Thread(runnable).start();

Lambda 表达式让代码更加简洁,提高了可读性。


二、Stream API 简介

Stream 是 Java 8 引入的一个强大的 API,用于处理集合中的数据流。它支持链式操作,允许我们以声明式的方式处理数据。

Stream 的操作类型

  1. 中间操作 :返回一个新的 Stream,如 filtermapsorted 等。
  2. 终止操作 :返回一个值或集合,如 collectreducecount 等。

三、常见的 Stream 操作示例

1. List 转 Set

我们可以通过 StreamList 转换为 Set,去除重复元素。

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class ListToSetExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 2, 3, 1);

        // List 转 Set
        Set<Integer> uniqueNumbers = numbers.stream().collect(Collectors.toSet());

        System.out.println("去重后的 Set: " + uniqueNumbers);
    }
}

输出

java 复制代码
去重后的 Set: [1, 2, 3, 4]

2. Map 转 List

通过 Stream 可以将 Map 的键、值或者键值对转为 List

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class MapToListExample {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "Java");
        map.put(2, "Python");
        map.put(3, "C++");

        // Map 的键转为 List
        List<Integer> keys = map.keySet().stream().collect(Collectors.toList());

        // Map 的值转为 List
        List<String> values = map.values().stream().collect(Collectors.toList());

        // Map 的键值对转为 List
        List<String> entries = map.entrySet().stream()
                .map(entry -> entry.getKey() + "=" + entry.getValue())
                .collect(Collectors.toList());

        System.out.println("键列表: " + keys);
        System.out.println("值列表: " + values);
        System.out.println("键值对列表: " + entries);
    }
}

输出

java 复制代码
键列表: [1, 2, 3]
值列表: [Java, Python, C++]
键值对列表: [1=Java, 2=Python, 3=C++]

3. 过滤(Filter)

通过 filter 方法可以对集合中的元素进行筛选。

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class FilterExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // 筛选名字长度大于 3 的元素
        List<String> filteredNames = names.stream()
                .filter(name -> name.length() > 3)
                .collect(Collectors.toList());

        System.out.println("筛选后的名字: " + filteredNames);
    }
}

输出

java 复制代码
筛选后的名字: [Alice, Charlie, David]

4. 求和

通过 reduce 方法可以对数字集合进行累加。

java 复制代码
import java.util.*;

public class SumExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 求和
        int sum = numbers.stream().reduce(0, Integer::sum);

        System.out.println("总和: " + sum);
    }
}

输出

java 复制代码
总和: 15

5. 分组

通过 Collectors.groupingBy 方法可以对集合中的元素进行分组。

java 复制代码
import java.util.*;
import java.util.stream.Collectors;

public class GroupingExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Daniel");

        // 按名字长度分组
        Map<Integer, List<String>> groupedByLength = names.stream()
                .collect(Collectors.groupingBy(String::length));

        System.out.println("按名字长度分组: " + groupedByLength);
    }
}

输出

java 复制代码
按名字长度分组: {3=[Bob], 5=[Alice, David], 7=[Charlie, Daniel]}

6. Map 和 Reduce 操作

  • Map:将元素映射为另一种类型。
  • Reduce:将多个值归约为一个值。
Map 示例
java 复制代码
import java.util.*;

public class MapExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("alice", "bob", "charlie");

        // 将名字转换为大写
        List<String> upperCaseNames = names.stream()
                .map(String::toUpperCase)
                .collect(Collectors.toList());

        System.out.println("转换为大写: " + upperCaseNames);
    }
}

输出

java 复制代码
转换为大写: [ALICE, BOB, CHARLIE]
Reduce 示例
java 复制代码
import java.util.*;

public class ReduceExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // 计算乘积
        int product = numbers.stream().reduce(1, (a, b) -> a * b);

        System.out.println("乘积: " + product);
    }
}

输出

java 复制代码
乘积: 120
相关推荐
2601_962071572 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
zww89491113 小时前
酒馆预约系统开发实战:从需求分析到上线全流程指南
java·eclipse
淡海水3 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
CS_Zero4 小时前
C语言sizeof是函数吗?
c语言·开发语言
-今昭-5 小时前
《V2V 迁移实战:将 VMware 虚拟机转为 OpenStack 可用 Glance qcow2 镜像》
开发语言·python
zww89491116 小时前
匿名树洞系统开发实战:从需求分析到部署指南
java·eclipse
黑马程序员毕设7 小时前
基于Java的医院药品管理系统的优化设计与实现
java·开发语言·spring boot·小程序·架构·课程设计·毕设
木井巳7 小时前
【BFS/DFS 解决 FloodFill 算法】太平洋大西洋水流问题
java·算法·leetcode·深度优先·广度优先·宽度优先·推荐算法
白山编程大哥7 小时前
Java 集合算法:从排序、查找到底层原理的实战指南
java·python·算法
_Twink1e7 小时前
openJiuwen 实训营 Day 1 · WorkSwarm 入门教程
开发语言·c++·openjiuwen