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

实现简单的Java函数式编程

发布时间:2023-06-23 07:15:24

Java是一种面向对象的编程语言,但自从Java 8版本发布后,它也支持了函数式编程的特性。Java的函数式编程旨在让开发者能够以更简洁、更直观的方式编写代码。本文将介绍如何在Java中实现简单的函数式编程。

一、Lambda表达式

Lambda表达式是Java函数式编程的关键之一。Lambda表达式是指一种可以匿名传递的函数,可以看做是一种函数的简写形式。Lambda表达式的基本语法如下:

(parameters) -> expression

或者

(parameters) -> { statements; }

其中,“->”是Lambda的操作符,parameters是一个参数列表,可以为空,expression是一个运算表达式,或者是一些语句块。如果expression是一个语句块,它需要用一些花括号({})包裹起来。

下面是一些示例:

1.使用Lambda表达式替代匿名内部类:

// 使用匿名内部类

new Thread(new Runnable(){

    public void run(){

        System.out.println("Hello world");

    }

}).start();

// 使用Lambda表达式

new Thread(() -> {

    System.out.println("Hello world");

}).start();

2.遍历List集合

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

// 使用for循环遍历

for (int i = 0; i < list.size(); i++) {

    System.out.println(list.get(i));

}

// 使用Lambda表达式遍历

list.forEach(n -> System.out.println(n));

3.使用Lambda表达式对List进行排序

List<String> list = Arrays.asList("java", "python", "ruby", "scala");

// 使用匿名内部类排序

Collections.sort(list, new Comparator<String>() {

    @Override

    public int compare(String s1, String s2) {

        return s1.compareTo(s2);

    }

});

// 使用Lambda表达式排序

Collections.sort(list, (s1, s2) -> s1.compareTo(s2));

二、函数接口

函数接口是一个只有一个抽象方法的接口,可以被Lambda表达式实现。Java 8中已经为我们定义了一些常用的函数接口,例如:Function接口,Predicate接口,Consumer接口等。下面是一些常见的函数接口:

1. Function接口

Function接口是Java 8中定义的一个函数接口,它接收一个输入参数(即领域对象),返回一个输出结果(即计算结果)。Function接口的抽象方法是:

R apply(T t);

其中,T是输入参数类型,R是输出结果类型。下面是一个使用Function接口的例子:

Function<String, Integer> toInteger = Integer::valueOf;

Function<String, String> backToString = toInteger.andThen(String::valueOf);

System.out.println(backToString.apply("123"));  // 输出"123"

2. Predicate接口

Predicate接口是Java 8中定义的一个函数接口,它接收一个输入参数,返回一个布尔值。Predicate接口的抽象方法是:

boolean test(T t);

其中,T是输入参数类型。下面是一个使用Predicate接口的例子:

Predicate<String> nonEmptyStringPredicate = (s) -> !s.isEmpty();

List<String> names = Arrays.asList("java", "", "scala", "python", "", "ruby");

List<String> nonEmptyNames = filter(names, nonEmptyStringPredicate);

System.out.println(nonEmptyNames);

static <T> List<T> filter(List<T> list, Predicate<T> p) {

    List<T> result = new ArrayList<>();

    for (T t : list) {

        if (p.test(t)) {

            result.add(t);

        }

    }

    return result;

}

这里使用Predicate接口来过滤List集合中空字符串的元素。

3. Consumer接口

Consumer接口是Java 8中定义的一个函数接口,它接收一个输入参数,没有返回值。Consumer接口的抽象方法是:

void accept(T t);

其中,T是输入参数类型。下面是一个使用Consumer接口的例子:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);

Consumer<Integer> action = (n) -> {

    System.out.println(n);

};

list.forEach(action);

这里使用Consumer接口打印出List集合中的所有元素。

三、方法引用

方法引用是一种代码段的简写形式,它可以替代Lambda表达式。当Lambda表达式只是调用已经存在的方法时,可以使用方法引用。方法引用的基本语法如下:

ClassName::methodName

或者

objectName::methodName

其中,ClassName是一个类名,methodName是一个静态方法名或非静态方法名。objectName是一个对象引用,methodName是该对象的方法名。下面是一些示例:

1.静态方法的引用

Function<String, Integer> toInteger = Integer::valueOf;

int num = toInteger.apply("123");

2.使用构造方法引用创建对象

Supplier<Apple> c1 = Apple::new;

Apple a1 = c1.get();

3.使用非静态方法的引用

List<String> cities = Arrays.asList("paris", "london", "new york", "tokyo", "beijing");

Collections.sort(cities, String::compareToIgnoreCase);

四、总结

Java 8中的函数式编程是一项非常强大的技术,让Java代码变得更加简洁、优雅。本文介绍了Java中的Lambda表达式、函数接口和方法引用,并且给出了一些示例代码。通过以上介绍,我们可以看到函数式编程可以帮助开发者写出更为简洁、易于维护的代码,降低代码的复杂度,提高开发效率。