JDK——java.util.function

JDK------java.util.function

最近java.util.function包用到的比较频繁,感觉很好用。系统整理一下,帮助快速回忆

结构总览

function包中的接口可以大致分为以下几种,根据接口名称也可以看出来:

  • function
  • predicate
  • supplier
  • consumer
  • operator

1.function

  • 代表一个函数,接收一个参数,返回一个参数。虽然一个function结构和功能较为单一,但可以通过多个function的组装完成复杂功能。(不禁联想FaaS)
  • 提供了compose andThen identity对function进行再处理的入口
  • BiFunction二元函数,相较于Function接口,可接收两参并返回
java 复制代码
public class FunctionTest {

    @Test
    public void test() {
        // int 转 str
        Function<Integer, String> int2Str = String::valueOf;
        // 平方
        Function<String, Integer> square = e -> {
            int i = Integer.parseInt(e);
            return i * i;
        };
        // 格式输出
        Function<String, Date> format = e -> new Date();

        String apply = int2Str.apply(5);
        // note: apply 实际传入的参数类型取决于compose,这里前置函数需要String类型,所以传入"5"
        // note: andThen 的函数入参必须是apply的return类型
        Date apply2 = int2Str
                .compose(square) // 前置处理: apply执行前,先计算平方
                .andThen(format) // 后置处理: apply执行后,格式化输出
                .apply("5"); // 处理


        System.out.println(apply);
        System.out.println(apply2); //
    }
    
	// 标记占位,用于拓展
    @Test
    public void test2() {
        List<String> names = List.of("Alice", "Bob", "Charlie");

        // note 定义可扩展的方法,处理逻辑动态传入. 使用Function.identity()进行占位
        List<String> processedNames = processList(names, Function.identity());

        System.out.println(processedNames); // 输出: [Alice, Bob, Charlie]
    }

    public static <T> List<T> processList(List<T> list, Function<T, T> processor) {
        List<T> result = new ArrayList<>();
        for (T item : list) {
            result.add(processor.apply(item)); // 应用处理函数
        }
        return result;
    }
}

2.predicate

  • 定义判断的函数
  • 如function一样,内部提供了 and or negate,即 与 或 非 逻辑,可以将多个判断进行组装
  • 提供了isEqual not静态工具,可快速返回指定predicate对象
java 复制代码
@Test
public void predicate(){
    // 定义一个predicate:是否是偶数
    Predicate<Integer> even = integer -> integer % 2 == 0;
    Assert.assertTrue("input not a even", even.test(6));

    // and 与上另一个predicate: 输入为偶数 且 大于5
    Predicate<Integer> and = even.and(input -> input > 5);
    Assert.assertTrue("input <= 5", and.test(6));
    // or 或上另一个predicate: 输入为偶数 或 大于10
    Predicate<Integer> or = even.or(input -> input > 10);
    Assert.assertTrue("input >= 10", or.test(6));
    // 取反: 是奇数
    Predicate<Integer> odd = even.negate();
    Assert.assertTrue("input not a odd", odd.test(7));


    // 静态函数:返回当前predicate的取反,内部调用的还是 negate
    Predicate<Integer> not = Predicate.not(even);
    Assert.assertTrue("input not a odd", not.test(7));
    // 静态函数: isEqual 返回一个predicate
    Predicate<String> equalMsg = Predicate.isEqual("msg");
    Assert.assertTrue(equalMsg.test("msg1"));
}

3.supplier

  • 通过supplier定义数据来源,使用get返回数据
  • XxSupplierSupplier接口进行了细化,功能类似
java 复制代码
// supplier: 定义数据提供者
@Test
public void supplier(){
    Supplier<List<String>> supplier = () -> {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        return list;
    };
    List<String> result = supplier.get();
    System.out.println(result);

    // XxSupplier   getAsXx
    }

4.consumer

  • Consumer<T>定义单参消费者,仅对入参进行消费处理,不返回
  • BiConsumer<T, U>二元消费者,允许两个入参
java 复制代码
@Test
public void biConsumer(){
    BiConsumer<String, String> biConsumer = (s, s2) -> System.out.println(s + " : " + s2);
    biConsumer.accept("a", "b");
} 

5.operator

具体的某种操作,可看做是对Function的细化,比如:元操作
UnaryOperator<T> extends Function<T, T>; 再比如其他具体到数据类型的操作,如IntUnaryOperator LongUnaryOperator等。

相关推荐
今天AI了吗11 分钟前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
许彰午30 分钟前
27-AuthService登录链路
java·低代码·架构
泡海椒35 分钟前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
Rain的Java大神之路2 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
自动化监测Learner2 小时前
Navicat Premium 17 中文版安装教程(2026最新版)
java·linux·数据库
那个松鼠很眼熟w2 小时前
4.Spring-Ai入门案例
java·人工智能·spring
计算机毕设定制辅导-无忧学长2 小时前
《基于SpringBoot青年公寓出租管理系统的设计与实现》
java·vue.js·spring boot·青年公寓出租管理系统
泡海椒3 小时前
JQuick-Curl 二次开发:自定义解析器、扩展点开发指南,如何把框架能力真正变成团队资产
java·开发语言·okhttp·maven
青山木4 小时前
Hot 100 --- 数组中的第K个最大元素
java·数据结构·算法·排序算法
玛卡巴卡ldf4 小时前
【AICoding】笔试提示词设计思路
java·算法·ai编程