Java8 教程

Java8 内置函数式接口 Function

Function<T,R> 是 Java 中的函数式接口,它代表一个函数,用来将一个类型为 T 的对象转换为类型为 R 的对象。它接受一个参数,执行转换操作,并返回一个转换后的结果。

Function<T,R> 接口只有一个抽象方法 R apply(T t),该方法用于将一个类型为 T 的对象转换为类型为 R 的对象。

使用 Function<T,R> 接口可以方便地实现一些转换操作,例如在需要将一个类型为 T 的对象转换为类型为 R 的对象时。另外,它也可以作为方法的参数,用于接收一个转换函数。

Function 定义

下面先看看 Function<T, R> 函数定义:

package java.util.function;

import java.util.Objects;

/**
* 代表接受一个参数并产生一个结果的函数。
* 这个功能接口的功能方法是 apply(Object)。
*
* @param <T> 函数的输入类型
* @param <R> 函数结果的类型
*
* @since 1.8
*/
@FunctionalInterface
public interface Function<T, R> {

   /**
    * 将此函数应用于给定的参数。
    *
    * @param t 函数参数
    * @return 函数结果
    */
   R apply(T t);

   /**
    * 返回一个组合函数,该函数首先对输入应用 before 函数,然后对结果应用此函数。
    * 如果对其中任一函数进行计算时出现异常,则会将异常转发给组合函数的调用者。
    *
    * @param <V> 指定 before 函数和组合函数的输入类型
    * @param before 在应用此函数之前要应用的函数
    * @return 组合函数,首先应用 before 函数,然后应用该函数
    * @throws NullPointerException 如果 before 是 null
    *
    * @see #andThen(Function)
    */
   default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
       Objects.requireNonNull(before);
       return (V v) -> apply(before.apply(v));
   }

   /**
    * 返回一个组合函数,该函数首先对输入应用此函数,然后对结果应用 after 函数。
    * 如果对任一函数的计算产生异常,则会将异常转发给组合函数的调用者。
    *
    * @param <V> 函数和组合函数的输出类型
    * @param after 应用此函数后要应用的函数
    * @return 组成函数,首先应用该函数,然后应用 after 函数
    * @throws 如果 after 为空,则抛出 NullPointerException
    *
    * @see #compose(Function)
    */
   default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
       Objects.requireNonNull(after);
       return (T t) -> after.apply(apply(t));
   }

   /**
    * 返回一个始终返回输入参数的函数。
    *
    * @param <T> 函数的输入和输出对象的类型
    * @return 总是返回其输入参数的函数
    */
   static <T> Function<T, T> identity() {
       return t -> t;
   }
}

Function 示例

该实例将通过输入一个字符串,返回字符串的长度。下面将通过匿名类和 Lambda 表达式实现:

匿名类方式实现

package com.hxstrive.jdk8.function_interface;

import java.util.function.Function;

/**
* Function<T,R> 函数式接口
* @author hxstrive.com
*/
public class FunctionDemo {

   public static void main(String[] args) {
       Function<String,Integer> function = new Function<String,Integer>() {
           @Override
           public Integer apply(String s) {
               return s.length();
           }
       };
       System.out.println(function.apply("hello world"));
   }

}

运行示例,输出如下:

11

Lambda方式实现

package com.hxstrive.jdk8.function_interface;

import java.util.function.Function;

/**
* Function<T,R> 函数式接口
* @author hxstrive.com
*/
public class FunctionDemo2 {

   public static void main(String[] args) {
       Function<String,Integer> function = (str) -> {
           return str.length();
       };
       System.out.println(function.apply("hello world"));
   }

}

运行示例,输出如下:

11
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号