IntSupplier supplier =()->42;// int -> intIntFunction<String> func = i ->"N"+ i;// int -> StringIntPredicate pred = i -> i >0;// int -> booleanIntConsumer consumer = i ->log(i);// int -> voidIntUnaryOperator op = i -> i *2;// int -> intIntBinaryOperator binOp =(a, b)-> a + b;// int,int -> int
Function<String,String> trim =String::trim;Function<String,String> toUpper =String::toUpperCase;Function<String,String> addPrefix = s ->"Hello, "+ s;// andThen:先执行当前,再执行参数Function<String,String> pipeline = trim.andThen(toUpper).andThen(addPrefix);String result = pipeline.apply(" alice ");// "Hello, ALICE"// compose:先执行参数,再执行当前Function<String,String> pipeline2 = addPrefix.compose(toUpper).compose(trim);String result2 = pipeline2.apply(" alice ");// "Hello, ALICE"
4.2 Predicate 组合
Predicate<String> nonEmpty = s ->!s.isEmpty();Predicate<String> shortStr = s -> s.length()<10;Predicate<String> startsWithA = s -> s.startsWith("A");// and / or / negatePredicate<String> combined = nonEmpty.and(shortStr).and(startsWithA.negate());
combined.test("Hello");// true
combined.test("ABCDEF");// false
4.3 Consumer 组合
Consumer<String> log = s ->System.out.println("LOG: "+ s);Consumer<String> audit = s ->System.out.println("AUDIT: "+ s);Consumer<String> logAndAudit = log.andThen(audit);
logAndAudit.accept("user login");// LOG: user login// AUDIT: user login
五、高阶函数实战
5.1 策略模式
// 传统策略模式需要多个类// 函数式策略模式:用 Map + Lambda 替代Map<String,Function<Double,Double>> strategies =Map.of("regular", p -> p *0.95,"vip", p -> p *0.8,"svip", p -> p *0.7);double discounted = strategies.getOrDefault(userLevel, p -> p).apply(originalPrice);
5.2 装饰器模式
// 函数式装饰器Function<String,String> base = s -> s;Function<Function<String,String>,Function<String,String>> trimDecorator =
fn -> s -> fn.apply(s.trim());Function<Function<String,String>,Function<String,String>> upperDecorator =
fn -> s -> fn.apply(s.toUpperCase());Function<Function<String,String>,Function<String,String>> prefixDecorator =
fn -> s -> fn.apply(">> "+ s);Function<String,String> decorated = trimDecorator
.andThen(upperDecorator).andThen(prefixDecorator).apply(base);
decorated.apply(" hello ");// ">> HELLO"
public<T>voidexecuteAsync(Supplier<T> task,Consumer<T> onSuccess,Consumer<Exception> onError){newThread(()->{try{T result = task.get();
onSuccess.accept(result);}catch(Exception e){
onError.accept(e);}}).start();}// 使用executeAsync(()->fetchData(),
result ->System.out.println("Success: "+ result),
error ->System.err.println("Error: "+ error.getMessage()));
六、常见陷阱
6.1 Lambda 中的 this
publicclassDemo{privateString name ="Outer";publicvoidtest(){// Lambda 中的 this 指向外部类实例Runnable r =()->System.out.println(this.name);// "Outer"// 匿名内部类中的 this 指向匿名类实例Runnable r2 =newRunnable(){privateString name ="Inner";publicvoidrun(){System.out.println(this.name);// "Inner"}};}}