Skip to content

Function 函数式接口

Function 是 Java 中的一个函数式接口,它表示接受一个输入参数并产生一个结果的函数。Function 接口定义了一个 apply 方法,用于对输入参数进行处理并返回结果。在函数式编程中,Function 接口常用于表示数据的转换或处理逻辑。

1 - 内置的函数式接口

在Java中,使用*@FunctionalInterface*注解来标识一个接口为函数式接口。函数式接口是指只包含一个抽象方法的接口。Java标准库中提供了许多内置的函数式接口,主要分为以下几类:

  1. Supplier:供给型函数,表示提供一个结果而不接受任何输入参数。

    java
    import java.util.function.Supplier; 
    public class Example {    
        public static void main(String[] args) {        
            // 定义一个 Supplier,提供一个字符串结果        
            Supplier<String> supplier = () -> "Hello, World!";  
            // 获取结果并输出        
            String result = supplier.get();      
            System.out.println(result);
        }
    }
  2. Consumer:消费型函数,表示接受一个输入参数并且不返回任何结果。

    java
    import java.util.function.Consumer; 
    public class Example {    
        public static void main(String[] args) { 
            // 定义一个 Consumer,打印输入的字符串  
            Consumer<String> consumer = str -> System.out.println("Input: " + str);  
            // 执行消费操作     
            consumer.accept("Hello, World!");    
        } 
    }
  3. Runnable:无参无返回型函数,是一个特殊的消费型函数,表示执行一个不接受参数并且没有返回值的操作。

    java
    public class Example { 
        public static void main(String[] args) {  
            // 定义一个 Runnable,执行打印操作     
            Runnable runnable = () -> System.out.println("Hello, World!");    
            // 执行操作   
            runnable.run();    
        } 
    }
  4. Function:有参有返回型函数,表示接受一个输入参数并且返回一个结果。

    java
    import java.util.function.Function; 
    public class Example {    
        public static void main(String[] args) {     
            // 定义一个 Function,将字符串转换为大写     
            Function<String, String> function = str -> str.toUpperCase();    
            // 调用函数并输出结果      
            String result = function.apply("hello, world!");     
            System.out.println(result);    
        } 
    }

2 - 使用技巧

  1. 链式调用

Function 接口的 andThen() 方法可以将多个函数连接在一起形成一个链式调用。这种方式可以使代码更加清晰和简洁。

java
import java.util.function.Function; 
public class Example {   
    public static void main(String[] args) {  
        Function<Integer, Integer> add = x -> x + 2;     
        Function<Integer, Integer> multiply = x -> x * 3;  
        // 先加2再乘3        
        Function<Integer, Integer> addAndMultiply = add.andThen(multiply);     
        System.out.println(addAndMultiply.apply(5)); // 输出为21    
    }
}
  1. 组合函数

Function 接口的 compose() 方法可以将多个函数组合起来形成一个新的函数。这种方式可以在不改变原有函数的情况下创建新的函数。

java
import java.util.function.Function;
public class Example {  
    public static void main(String[] args) {   
        Function<Integer, Integer> add = x -> x + 2;       
        Function<Integer, Integer> multiply = x -> x * 3;         
        // 先乘3再加2       
        Function<Integer, Integer> multiplyAndAdd = add.compose(multiply);      
        System.out.println(multiplyAndAdd.apply(5)); // 输出为17  
    } 
}
  1. 转换类型

Function 接口可以用于将一种类型的值转换为另一种类型的值。这种方式可以在不使用显式类型转换的情况下进行类型转换。

java
import java.util.function.Function; 
public class Example {   
    public static void main(String[] args) {    
        Function<String, Integer> parseInt = Integer::parseInt;  
        int intValue = parseInt.apply("123");   
        System.out.println(intValue); // 输出为123  
    }
}
  1. 复杂的数据处理

Function 接口可以用于对复杂的数据进行处理,如集合元素的转换、过滤、映射等操作。

java
import java.util.Arrays;
import java.util.List; 
import java.util.function.Function; 
import java.util.stream.Collectors;
public class Example {  
    public static void main(String[] args) { 
        List<String> names = Arrays.asList("John", "Alice", "Bob"); 
        // 将每个名字转换为大写     
        List<String> upperCaseNames = names.stream()  
            .map(String::toUpperCase)        
            .collect(Collectors.toList());    
        System.out.println(upperCaseNames);  
    }
}

技术漫游

本站访客数 人次 本站总访问量