欢迎访问宙启技术站
智能推送

运用Java中的Lambda表达式编写函数式接口的例子。

发布时间:2023-06-21 00:59:56

Lambda表达式是Java8中引入的一个全新的特性,它主要用于简化代码中匿名内部类的书写,使得代码更加简洁。Lambda表达式可以看做是一个函数式接口的实例,因此,若需要使用Lambda表达式,就需要先定义一个函数式接口。

函数式接口(Functional Interface)是指仅包含一个抽象方法的接口,例如:

public interface MyInterface{
    void myMethod();
}

在Java8中,函数式接口可以通过@FunctionalInterface注解进行标记,以方便检查它是否真的只包含一个抽象方法。在函数式接口中我们可以使用Lambda表达式来传递实现,例如:

MyInterface obj = () -> System.out.println("Hello World");
obj.myMethod();

Lambda表达式本质上是一个函数,因此它的确切格式是:

(parameter)->{statements}

其中,parameter是Lambda表达式传递给函数的参数,statements是Lambda表达式的主体部分。

下面我们来看一个简单的例子,假设我们需要对一个数组进行排序,并且需要将排序的方式作为参数进行传递。

import java.util.Arrays;
import java.util.Comparator;

public class LambdaExample {
    
    public static void main(String[] args) {
        
        String[] array = {"aaa", "b", "cccc", "dd"};
        
        // 使用Lambda表达式排序
        Arrays.sort(array, (String a, String b) -> (a.length() - b.length()));
        
        // 打印排序后的结果
        for (String s : array) {
            System.out.println(s);
        }
        
    }
    
}

这个例子中,我们通过Lambda表达式来传递一个Comparator,这个Comparator用于对数组中的元素进行排序。在Lambda表达式中,我们使用了参数类型和返回类型的推断,因此,如果你愿意,你甚至可以把Lambda表达式简写成:

Arrays.sort(array, (a, b) -> a.length() - b.length());

可以看到,通过使用Lambda表达式,我们的代码变得更加简洁、易读。

除了使用Lambda表达式传递参数外,我们还可以使用Lambda表达式来传递代码块。下面我们来举个例子,假设我们有一个函数式接口,用于将一个字符串转换为大写。那么,我们可以使用Lambda表达式来实现这个函数式接口:

public interface StringConverter {
    String convert(String s);
}

public class LambdaExample {
    
    public static void main(String[] args) {
        
        StringConverter conv = (String s) -> { 
            return s.toUpperCase(); 
        };
        
        // 打印转换后的结果
        System.out.println(conv.convert("hello world"));
        
    }
    
}

在这个例子中,我们使用了Lambda表达式来将一个字符串转换成大写形式。可以看到,这个Lambda表达式接收一个字符串作为参数,然后将这个字符串转换为大写。最后,我们使用Lambda表达式创建了一个StringConverter实例,并且使用这个实例将“hello world”转换为大写形式。

需要注意的是,Lambda表达式应该很少用于单独的语句。你通常可以使用Lambda表达式来创建更复杂的函数式接口,如:

public interface MyInterface {
    int operate(int a, int b);
}

public class LambdaExample {
    
    public static void main(String[] args) {
        
        // 定义一个加法函数
        MyInterface add = (a, b) -> a + b;
        
        // 定义一个乘法函数
        MyInterface multiply = (a, b) -> a * b;
        
        // 定义一个计算器类
        Calculator cal = new Calculator();
        
        // 使用加法函数计算5和10的和
        int result1 = cal.calculate(5, 10, add);
        System.out.println(result1);
        
        // 使用乘法函数计算5和10的积
        int result2 = cal.calculate(5, 10, multiply);
        System.out.println(result2);
        
    }
    
}

class Calculator {
    
    public int calculate(int a, int b, MyInterface operator) {
        return operator.operate(a, b);
    }
    
}

在这个例子中,我们定义了一个函数式接口MyInterface,这个接口包含了一个抽象方法operate,这个方法接受两个int参数,并且返回一个int值。然后,我们定义了两个Lambda表达式,用于分别表示加法和乘法运算。接着,我们定义了一个计算器类Calculator,这个类中包含了一个方法calculate,它接受三个参数:两个int参数和一个MyInterface接口。在calculate方法中,我们调用了MyInterface中的抽象方法operate,并且将a和b作为参数传递给它。

最后,我们创建了一个Calculator实例,并且分别使用加法和乘法函数来计算两个数的和和积。可以看到,使用Lambda表达式可以大幅度的简化代码的书写。