Java8-Function

最近接触的项目里用到了Function接口里面的几个方法,了解之后在此做一些记录。
Ctrl+左键点击Function,进去之后发现如下代码

package java.util.function;

import java.util.Objects;

@FunctionalInterface
public interface Function<T, R> {
    R apply(T var1);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return this.apply(var1.apply(var2));
        };
    }

    default <V> Function<T, V> andThen(Function<? super R, ? extends V> var1) {
        Objects.requireNonNull(var1);
        return (var2) -> {
            return var1.apply(this.apply(var2));
        };
    }

    static <T> Function<T, T> identity() {
        return (var0) -> {
            return var0;
        };
    }
}

首先看到,该接口被注解@FunctionalInterface修饰,通过了解知道,该注解意思是函数式接口,详细了解可以跳https://blog.csdn.net/qq_37595946/article/details/93166029,里面说的很详细。
Function里面有四个方法,分别是apply,compose,andThen和identity。
1.apply
示例代码

 Function<Integer, Integer> function = s -> s * 7;
 Integer apply = function.apply(5);
 System.out.println(apply);//35
 
 Function<Integer, String> function1 = s -> s * 7 + "周";
 String apply1 = function1.apply(5);
 System.out.println(apply1);//35周

由示例可看出,Function<T, R>和R apply(T var1),里面的T代表入参,T泛型定义返回值类型。
2.compose
简单来说就是:A.compose(B).apply(T),先执行B表达式,然后返回的结果作为A的入参,再执行A表达式。

        String apply2 = function1.compose(function).apply(6);
        Integer apply3 = function.compose(function1).apply(6);

上面两个示例,需要注意,第一个是正确的,第二个是会报错的,因为function1的返回值是String,而function的入参是Integer。
3.andThen
它和上面的compose来说几乎一样,不过顺序是反着的,A.compose(B).apply(T),先执行A表达式,然后返回的结果作为B的入参,再执行B表达式。

        String apply4 = function.andThen(function1).apply(6);
        Integer apply5 = function1.andThen(function).apply(6);

同样,上面两个示例,第一个是正确的,第二个是错误的。
4.identity
Ctrl+左键,进去发现

    static <T> Function<T, T> identity() {
        return (var0) -> {
            return var0;
        };
    }

其实就是返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式。

 List<Integer> list = new ArrayList();
 list.add(1);
 list.add(2);
 list.add(3);
 list.add(4);
 list.add(5);
 Map<Integer, Integer> collect = list.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
 System.out.println(collect);//{1=1, 2=2, 3=3, 4=4, 5=5}

以上来自一个不善于表达的程序员,如果有错误的地方,欢迎大家指出来。鞠躬!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值