← 返回首页

Java Lambda表达式详解

📂 java ⏱ 3 min 517 words

Java Lambda表达式详解

Lambda基础语法

// 无参数无返回值
Runnable r = () -> System.out.println("Hello Lambda");

// 有参数无返回值
Consumer<String> printer = s -> System.out.println(s);

// 有参数有返回值
Function<String, Integer> lengthFunc = s -> s.length();

// 多行lambda
Function<String, String> processor = s -> {
    String trimmed = s.trim();
    return trimmed.toLowerCase();
};

函数式接口

// JDK内置函数式接口
@FunctionalInterface
public interface MyFunction<T, R> {
    R apply(T t);
}

// Predicate:断言,返回boolean
Predicate<Integer> isPositive = n -> n > 0;
System.out.println(isPositive.test(5));  // true

// Function:转换
Function<String, Integer> toLength = String::length;
System.out.println(toLength.apply("hello"));  // 5

// Consumer:消费
Consumer<String> print = System.out::println;
print.accept("hello");

// Supplier:提供
Supplier<Double> random = Math::random;
System.out.println(random.get());

// UnaryOperator:一元操作
UnaryOperator<String> upper = String::toUpperCase;
System.out.println(upper.apply("hello"));  // HELLO

// BinaryOperator:二元操作
BinaryOperator<Integer> add = Integer::sum;
System.out.println(add.apply(1, 2));  // 3

方法引用

public class MethodRefDemo {
    // 静态方法引用:ClassName::staticMethod
    Function<String, Integer> parseInt = Integer::parseInt;

    // 实例方法引用:instance::method
    String str = "hello";
    Supplier<Integer> lengthSupplier = str::length;

    // 特定对象的实例方法引用:ClassName::methodName
    Function<String, Integer> strLength = String::length;

    // 构造器引用:ClassName::new
    Supplier<ArrayList<String>> listFactory = ArrayList::new;
    Function<String, StringBuilder> sbFactory = StringBuilder::new;

    public static void main(String[] args) {
        List<String> names = List.of("Alice", "Bob", "Charlie");

        // 使用方法引用替代lambda
        List<Integer> lengths = names.stream()
            .map(String::length)     // 方法引用
            .toList();

        List<String> upper = names.stream()
            .map(String::toUpperCase) // 方法引用
            .toList();
    }
}

Lambda实际应用

集合操作

public class LambdaCollections {
    public static void main(String[] args) {
        List<Integer> numbers = List.of(5, 3, 8, 1, 9, 2, 7);

        // 排序
        List<Integer> sorted = numbers.stream()
            .sorted((a, b) -> b - a)  // 降序
            .toList();
        // [9, 8, 7, 5, 3, 2, 1]

        // 过滤并转换
        List<String> result = numbers.stream()
            .filter(n -> n % 2 == 0)
            .map(n -> "偶数: " + n)
            .toList();

        // 归约
        int sum = numbers.stream()
            .reduce(0, Integer::sum);

        // 收集到Map
        Map<Boolean, List<Integer>> partitioned = numbers.stream()
            .collect(Collectors.partitioningBy(n -> n > 5));
    }
}

事件处理

public class EventDemo {
    public static void main(String[] args) {
        JButton button = new JButton("Click me");

        // Lambda简化事件处理
        button.addActionListener(e ->
            System.out.println("按钮被点击")
        );

        // 多行lambda
        button.addActionListener(e -> {
            System.out.println("按钮被点击");
            updateUI();
            sendNotification();
        });
    }
}

自定义函数式接口

@FunctionalInterface
public interface Transformer<T> {
    T transform(T input);

    default Transformer<T> andThen(Transformer<T> after) {
        return input -> after.transform(this.transform(input));
    }
}

// 使用
Transformer<String> trim = String::trim;
Transformer<String> lower = String::toLowerCase;
Transformer<String> process = trim.andThen(lower);

System.out.println(process.transform("  Hello  "));  // "hello"

异步回调

@FunctionalInterface
public interface AsyncCallback<T> {
    void onSuccess(T result);
    void onError(Throwable error);
}

public class AsyncService {
    public <T> void executeAsync(Supplier<T> task, AsyncCallback<T> callback) {
        new Thread(() -> {
            try {
                T result = task.get();
                callback.onSuccess(result);
            } catch (Exception e) {
                callback.onError(e);
            }
        }).start();
    }
}

// 使用
AsyncService service = new AsyncService();
service.executeAsync(
    () -> fetchDataFromDB(),
    new AsyncCallback<>() {
        @Override
        public void onSuccess(String result) {
            System.out.println("成功: " + result);
        }
        @Override
        public void onError(Throwable error) {
            System.out.println("失败: " + error.getMessage());
        }
    }
);

Lambda与Optional结合

public class OptionalLambda {
    public static void main(String[] args) {
        Optional<String> name = Optional.of("Alice");

        // ifPresent + lambda
        name.ifPresent(n -> System.out.println("名字: " + n));

        // map + lambda
        Optional<Integer> length = name.map(String::length);

        // orElse + lambda
        String result = name.orElse("Unknown");

        // 链式操作
        String greeting = Optional.ofNullable(getUser())
            .map(User::getName)
            .map("Hello, "::concat)
            .orElse("Hello, Guest");
    }
}

Lambda性能优化

public class LambdaPerformance {
    // 不推荐:每次调用都创建新的lambda实例
    public void bad() {
        numbers.stream()
            .filter(n -> n > 0)  // 每次创建新实例
            .toList();
    }

    // 推荐:将lambda提取为常量
    private static final Predicate<Integer> IS_POSITIVE = n -> n > 0;

    public void good() {
        numbers.stream()
            .filter(IS_POSITIVE)  // 复用同一个实例
            .toList();
    }
}

总结

Lambda表达式是Java 8最重要的特性之一,配合函数式接口可以写出简洁、声明式的代码。掌握方法引用和函数式接口是高效使用Lambda的关键。