Java8新特性之Function

本文详细介绍了Java8中的Function接口,包括其核心方法apply、compose、andThen及静态方法identity的使用。通过示例展示了如何利用Lambda表达式和匿名内部类创建Function实例,并解释了compose和andThen方法的执行顺序。最后,通过具体代码展示了Function在实际编程中的应用,帮助读者理解并掌握这一关键接口。
摘要由CSDN通过智能技术生成
  • Function是一个接口,在java.util.function包中,下面看一下具体的代码
package java.util.function;import java.util.Objects;@FunctionalInterface
public interface Function<T, R> {
​
    R apply(T t);default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
        Objects.requireNonNull(after);
        return (T t) -> after.apply(apply(t));
    }static <T> Function<T, T> identity() {
        return t -> t;
    }
}
  • Function一共四个方法,一个抽象方法apply,两个默认方法compose、andThen,一个静态方法identity,关于接口中的default、static方法,
    可以参考:Java8特性之接口default和static方法

  • @FunctionalInterface,表示一个函数式接口(只有一个抽象方法的接口就叫做函数式接口,但可以有多个default和static方法,可以显示注明一个接口是函数式接口,也可以不加,但是建议添加注解,表明接口是一个函数式接口);

  • Function<T, R>,T表示参数,R表示返回值。

  • 下面看一下具体的使用方法,以下内容需要掌握匿名内部类和Lambda表达式相关内容,
    可以参考作者之前写的文章:
    Java匿名内部类
    Java8特性之Lambda表达式

public class TestFunction {public static void main(String[] args) {
        /**
         * 下面两句很好理解,了解匿名内部类和Lambda表达式的都应该看得懂
         * 就是实例化一个Function,并实现了apply方法,然后调用apply方法  
         */
        Function<Integer, String> f = a -> "参数为:" + a;
        System.out.println(f.apply(100));/**
         * 下面两句和上面两句一样,只是改变了apply的实现方式
         */
        Function<String,Boolean> f1 = b -> b.length() > 4;
        System.out.println(f1.apply("hello"));
        
        /**
         * 这个地方需要注意一个小细节,f调用andThen时,参数Function的
         * 第一个参数的类型和f的返回值类型需要一致,f的返回值类型为String,f1的第
         * 一个参数类型正好也是String,如果是f1.andThen(f)这样就不行了
         * 下面就看一下andThen这个方法执行的顺序就可以了。
         * 首先执行f的apply方法,结果为:参数为:101,然后执行f1的apply
         * 方法,“参数为:101”的长度大于4,所有结果为true
         */
        System.out.println(f.andThen(f1).apply(101));
​
        Function<Integer, Integer> f2 = c -> c * c;
        /**
         * 类似andThen,f调用compose时,参数Function的第二个参数的类型
         * 和f的参数类型需要一致,f的参数类型为Integer,f2的返回值类型
         * 也是Integer。下面就看一下compse这个方法的执行顺序。
         * 首先执行f2的apply方法,结果为:16;然后执行f的apply方法,
         * 参数为:16,所以结果为:参数为:16
         */
        System.out.println(f.compose(f2).apply(4));
        
        /**
         * 首先调用f2的apply方法,结果:16
         * 第二步,调用f的apply方法,结果:参数为:16
         * 第三步,调用f1的apply方法,结果为:true
         */
        System.out.println(f.compose(f2).andThen(f1).apply(4));
​
        System.out.println(f2.compose(f2).apply(4));
        
        /**
         * 这个就是简单的返回传入的参数
         */
        Function<String, String> function3 = Function.identity();
        System.out.println(function3.apply("hello-world"));}
}
  • 输出结果:
参数为:100
true
true
参数为:16
true
256
hello-world

好了,Function的大致用法介绍完了,是不是有点晕,先消化一下,我们下节再深入。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值