欢迎访问宙启技术站
智能推送

Java函数式编程实战总结

发布时间:2023-05-29 03:38:59

Java函数式编程(Functional Programming)是一种应用程序设计范式,其核心概念是函数与函数之间的组合,以及不可变数据结构和 的函数,以减少代码复杂性和提高代码可维护性。Java 8 对函数式编程提供了大力支持,引入了函数式接口、Lambda 表达式、流(Stream)等新特性。本文将介绍 Java 函数式编程的实战应用。

函数式接口

在 Java 8 中提供了许多函数式接口,它们是只有一个抽象方法的接口,通常可以通过 Lambda 表达式或方法引用来创建该接口的实例,例如:Runnable、Comparator、Consumer、Function、Predicate 等接口。我们可以使用 @FunctionalInterface 标注来强制检查是否满足函数式接口的要求。例如:

@FunctionalInterface
public interface Foo<T> {
    void foo(T t);
    default void bar() {}  // 接口中可以包含默认方法
}

Lambda 表达式

Lambda 表达式是一个匿名函数,可以在内联上下文中使用。Lambda 表达式的语法非常简洁,包含以下几个部分:形式参数列表,箭头符号,Lambda 主体,例如:

// 无参 Lambda 表达式
() -> System.out.println("Hello, world!");

// 有参 Lambda 表达式
(x, y) -> x + y

// 代码块 Lambda 表达式
(int x, int y) -> {
    int result = x + y;
    return result;
}

Lambda 表达式可以作为方法参数,也可以作为变量使用,例如:

// 使用 Lambda 表达式作为方法参数
Arrays.asList(1, 2, 3).forEach(x -> System.out.println(x));

// 使用 Lambda 表达式作为变量
Runnable r = () -> System.out.println("Hello, world!");

Java 8 中的流是一个元素序列,支持顺序和并行处理,可以通过各种操作来转换和计算。流的操作可以分为中间操作和终端操作两种,中间操作会返回一个新的流对象,终端操作会产生一个非流的结果。例如:

// 获取 List 中所有偶数的集合
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evenNumbers = numbers.stream()
        .filter(n -> n % 2 == 0)
        .collect(Collectors.toList());

// 通过流计算字符串数组中所有字符的长度总和
String[] words = {"hello", "world", "java"};
int totalLength = Arrays.stream(words)
        .mapToInt(String::length)
        .sum();

方法引用

方法引用是一种简化 Lambda 表达式的语法,可以通过方法的名称来简洁地实现 Lambda 表达式所代表的功能。方法引用可以分为四种:

- 静态方法引用:类名::staticMethod

- 实例方法引用:对象::instanceMethod

- 构造方法引用:类名::new

- 数组构造方法引用:Type[]::new

例如:

// 静态方法引用
Arrays.asList(1, 2, 3).forEach(System.out::println);

// 实例方法引用
String str = "hello";
Function<Integer, Character> func = str::charAt;

// 构造方法引用
Supplier<List<Integer>> supplier = ArrayList::new;

// 数组构造方法引用
Function<Integer, int[]> creator = int[]::new;

并发编程

Java 8 中的并发编程也得到了大力强化,新增了许多并发原语和工具类,例如 CompletableFuture、Stream.parallel()、Atomic 相关类和 ConcurrentHashMap 等。我们可以使用 CompletableFuture 实现并行请求多个 Http 请求:

public List<String> fetch(List<String> urls) {
    return urls.stream()
            .map(url -> CompletableFuture.supplyAsync(() -> request(url)))
            .map(CompletableFuture::join)
            .collect(Collectors.toList());
}

总结

Java 函数式编程是一种强大的编程范式,它能使代码更加简洁高效,减少错误发生概率,提高代码可重用性和可维护性。本文介绍了 Java 函数式编程中的函数式接口、Lambda 表达式、流、方法引用和并发编程等实战应用,希望对读者有所帮助。