### Java函数式编程Lambda表达式与StreamAPI实战指南

#### 一、Lambda表达式基础

1. 基本语法

```java

(parameters) -> expression

(parameters) -> { statements; }

```

2. 常见用法示例

```java

// 替代匿名内部类

Runnable task = () -> System.out.println(运行任务);

new Thread(task).start();

// 集合排序

List names = Arrays.asList(John, Alice, Bob);

Collections.sort(names, (a, b) -> a.compareTo(b));

// 事件处理

button.addActionListener(e -> System.out.println(按钮被点击));

```

#### 二、函数式接口应用

1. 内置函数式接口

```java

// Predicate - 条件判断

Predicate lengthCheck = s -> s.length() > 5;

boolean result = lengthCheck.test(Hello World);

// Function - 数据转换

Function stringToInt = Integer::parseInt;

Integer number = stringToInt.apply(123);

// Consumer - 消费数据

Consumer printer = System.out::println;

printer.accept(Hello Lambda);

// Supplier - 数据提供

Supplier randomSupplier = Math::random;

Double randomValue = randomSupplier.get();

```

#### 三、Stream API核心操作

1. 创建Stream

```java

// 从集合创建

List list = Arrays.asList(a, b, c);

Stream stream1 = list.stream();

// 从数组创建

String[] array = {a, b, c};

Stream stream2 = Arrays.stream(array);

// 使用Stream.of

Stream stream3 = Stream.of(a, b, c);

// 生成无限流

Stream infiniteStream = Stream.iterate(0, n -> n + 1);

```

2. 中间操作

```java

List words = Arrays.asList(apple, banana, cherry, date);

// filter - 过滤

List longWords = words.stream()

.filter(word -> word.length() > 5)

.collect(Collectors.toList());

// map - 转换

List wordLengths = words.stream()

.map(String::length)

.collect(Collectors.toList());

// sorted - 排序

List sortedWords = words.stream()

.sorted(Comparator.reverseOrder())

.collect(Collectors.toList());

// distinct - 去重

List uniqueWords = words.stream()

.distinct()

.collect(Collectors.toList());

```

3. 终端操作

```java

List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

// collect - 收集结果

List evenNumbers = numbers.stream()

.filter(n -> n % 2 == 0)

.collect(Collectors.toList());

// forEach - 遍历

numbers.stream()

.filter(n -> n > 5)

.forEach(System.out::println);

// reduce - 归约

Optional sum = numbers.stream()

.reduce(Integer::sum);

// count - 计数

long count = numbers.stream()

.filter(n -> n % 2 == 0)

.count();

```

#### 四、实战案例

1. 数据处理示例

```java

public class EmployeeProcessor {

private List employees;

public EmployeeProcessor(List employees) {

this.employees = employees;

}

// 获取高薪员工

public List getHighSalaryEmployees(double threshold) {

return employees.stream()

.filter(emp -> emp.getSalary() > threshold)

.sorted((e1, e2) -> Double.compare(e2.getSalary(), e1.getSalary()))

.collect(Collectors.toList());

}

// 按部门分组

public Map> groupByDepartment() {

return employees.stream()

.collect(Collectors.groupingBy(Employee::getDepartment));

}

// 统计部门薪资

public Map getDepartmentSalaryStats() {

return employees.stream()

.collect(Collectors.groupingBy(

Employee::getDepartment,

Collectors.averagingDouble(Employee::getSalary)

));

}

}

```

2. 文件处理示例

```java

public class FileProcessor {

// 读取文件并处理

public void processFile(String filePath) throws IOException {

List lines = Files.lines(Paths.get(filePath))

.filter(line -> !line.trim().isEmpty())

.map(String::toUpperCase)

.collect(Collectors.toList());

// 写入处理后的内容

Files.write(Paths.get(output.txt), lines);

}

// 统计单词频率

public Map wordFrequency(String text) {

return Arrays.stream(text.split(\W+))

.filter(word -> !word.isEmpty())

.map(String::toLowerCase)

.collect(Collectors.groupingBy(

Function.identity(),

Collectors.counting()

));

}

}

```

3. 集合操作优化

```java

public class CollectionOptimizer {

// 并行流处理大数据集

public void processLargeDataset(List dataset) {

List results = dataset.parallelStream()

.filter(data -> data.isValid())

.map(this::processData)

.collect(Collectors.toList());

}

// 链式操作优化

public Optional findOptimalValue(List values) {

return values.stream()

.filter(this::isValid)

.max(Comparator.comparing(String::length)

.thenComparing(String::compareTo));

}

}

```

#### 五、性能优化技巧

1. 避免在流中执行耗时操作

```java

// 不推荐

list.stream().map(item -> {

// 耗时操作

return processItem(item);

});

// 推荐使用并行流

list.parallelStream().map(item -> processItem(item));

```

2. 合理使用短路操作

```java

// 使用findFirst而不是filter().collect()获取第一个匹配项

Optional result = list.stream()

.filter(s -> s.startsWith(A))

.findFirst();

```

3. 避免不必要的装箱操作

```java

// 使用原始类型流提高性能

IntStream.range(0, 1000)

.filter(i -> i % 2 == 0)

.sum();

```

#### 六、最佳实践

1. 保持Lambda表达式简洁

2. 使用方法引用提升可读性

3. 合理使用并行流

4. 注意异常处理

5. 避免在Lambda中修改外部状态

通过掌握Lambda表达式和Stream API,可以显著提升Java代码的简洁性和可维护性,同时利用函数式编程的特性编写出更高效、更易读的代码。

更多推荐