Function 用法:

Function 是 Java 8 函数式接口 ,核心作用:接收一个参数,处理后返回一个结果(参数和返回值类型可以不同)。

简单理解:你给它一个原料,它加工完给你一个成品有入参,有返回值

一、核心定义

java

运行

csharp 复制代码
@FunctionalInterface
public interface Function<T, R> {
    // 唯一抽象方法:T=入参类型,R=返回值类型
    R apply(T t);
}
  • T:输入(参数)的类型
  • R:输出(返回)的类型
  • 核心方法:R apply(T t)
  • 专门做:有参数、有返回值的转换 / 计算 / 处理

二、最基础用法(必看)

1. 匿名内部类(老式)

java

运行

typescript 复制代码
import java.util.function.Function;

public class FunctionTest {
    public static void main(String[] args) {
        // 功能:接收 String,返回其长度 Integer
        Function<String, Integer> fun = new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return s.length();
            }
        };

        int len = fun.apply("Hello");
        System.out.println(len); // 输出 5
    }
}

2. Lambda 简化(推荐)

java

运行

arduino 复制代码
public class FunctionTest {
    public static void main(String[] args) {
        // 字符串 → 长度
        Function<String, Integer> getLength = s -> s.length();
        
        int result = getLength.apply("Java Function");
        System.out.println(result); // 输出 13
    }
}

三、常用场景:类型转换、数据处理

示例 1:字符串转整数

java

运行

ini 复制代码
// String → Integer
Function<String, Integer> strToInt = s -> Integer.parseInt(s);
int num = strToInt.apply("100");
System.out.println(num + 1); // 101

示例 2:对象 → 某个属性(开发最常用)

java

运行

arduino 复制代码
class User {
    private String name;
    private int age;
    // 构造、getter
    public User(String name, int age) { this.name = name; this.age = age; }
    public String getName() { return name; }
}

// 使用:User → String(姓名)
Function<User, String> getUserName = user -> user.getName();

User user = new User("张三", 20);
String name = getUserName.apply(user);
System.out.println(name); // 张三

四、高级用法:链式调用(compose /andThen)

Function 支持多个函数串联执行,非常强大!

1. andThen:先执行当前,再执行下一个

java

运行

typescript 复制代码
public class FunctionTest {
    public static void main(String[] args) {
        // f1:字符串 → 长度
        Function<String, Integer> f1 = s -> s.length();
        
        // f2:数字 → 平方
        Function<Integer, Integer> f2 = i -> i * i;

        // 先执行 f1,再执行 f2
        Function<String, Integer> chain = f1.andThen(f2);
        
        int result = chain.apply("Hello");
        System.out.println(result); // 5² = 25
    }
}

2. compose:先执行参数里的函数,再执行自己

java

运行

ini 复制代码
// f2.compose(f1) = 先 f1,再 f2
Function<String, Integer> chain2 = f2.compose(f1);
int result2 = chain2.apply("Hello"); // 同样 25

五、实战:封装通用工具方法

Function 当参数传入,实现通用数据提取 / 转换,代码极度灵活!

java

运行

typescript 复制代码
public class FunctionTest {
    // 通用工具:传入数据 + 转换规则,返回转换后的结果
    public static <T, R> R convert(T data, Function<T, R> function) {
        return function.apply(data);
    }

    public static void main(String[] args) {
        User user = new User("李四", 25);

        // 提取姓名
        String name = convert(user, u -> u.getName());
        System.out.println("姓名:" + name);

        // 提取年龄
        int age = convert(user, u -> u.getAge());
        System.out.println("年龄:" + age);

        // 自定义转换:年龄+10
        int newAge = convert(user, u -> u.getAge() + 10);
        System.out.println("新年龄:" + newAge);
    }
}

六、扩展:BiFunction(两个参数)

如果需要接收两个参数 ,用 BiFunction<T, U, R>

  • T:参数 1
  • U:参数 2
  • R:返回值

java

运行

arduino 复制代码
import java.util.function.BiFunction;

public class FunctionTest {
    public static void main(String[] args) {
        // 两个 int → 求和
        BiFunction<Integer, Integer, Integer> add = (a, b) -> a + b;
        
        int sum = add.apply(10, 20);
        System.out.println(sum); // 30
    }
}

七、Stream 中最常用(开发必备)

Stream.map() 方法的参数就是 Function

java

运行

java 复制代码
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FunctionTest {
    public static void main(String[] args) {
        List<User> userList = Arrays.asList(
            new User("小明", 20),
            new User("小红", 18)
        );

        // map(Function):提取所有姓名
        List<String> nameList = userList.stream()
                .map(user -> user.getName()) // Function<User, String>
                .collect(Collectors.toList());

        System.out.println(nameList); // [小明, 小红]
    }
}

八、Function vs Consumer(必区分)

表格

接口 入参 返回值 用途
Function 1 个 转换、计算、提取、处理
Consumer 1 个 打印、修改、消费、执行

一句话区分:

  • 需要返回结果 → 用 Function
  • 不需要返回结果 → 用 Consumer
相关推荐
做个文艺程序员2 小时前
流式输出(SSE)在 Spring Boot 中的实现【OpenClAW + Spring Boot 系列 第3篇】
java·spring boot·后端
逻辑驱动的ken2 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
小手cool2 小时前
如何在Java中根据另一个配对集合对一个集合进行排序
java·开发语言
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
升鲜宝供应链及收银系统源代码服务2 小时前
OMS 订单模块重构正式文档(一)---升鲜宝生鲜配送供应链管理系统
java·开发语言·重构·生鲜配送源代码·生鲜供应链源代码
Han.miracle2 小时前
Redis 全套笔记:基础 API + 三大架构 + 缓存三大问题
java·windows·redis
zzb15802 小时前
Fragment 生命周期深度图解:从 onAttach 到 onDetach 完整流程(面试必备)
android·java·面试·安卓
银色火焰战车3 小时前
浅析golang中的垃圾回收机制(GC)
java·jvm·golang
zhangjw343 小时前
第4篇:Java数组与字符串:从基础用法到面试高频考点
java·java基础知识