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

Java中的lambda表达式和函数式接口应用

发布时间:2023-06-07 15:42:00

Java中的lambda表达式和函数式接口是Java 8之后引入的新特性,它们可以使Java程序更简洁、更易读、更高效。本文将分别介绍这两个特性,并且带有应用实例。

一、lambda表达式

lambda表达式是Java 8引入的一种轻量级的匿名函数,它可以传递方法作为参数。它的形式如下:

(parameters) -> expression

或者

(parameters) -> { statements; }

parameters:参数列表,可以为空或包含一个或多个参数。

->:符号,用来分隔参数列表和lambda表达式体。

expression或{ statements; }:lambda表达式的实现体,可以是表达式或一系列表达式的语句块。

示例:

普通方式:

public class Test {

    public static void main(String[] args) {

        new Thread(new Runnable() {

            @Override

            public void run() {

                System.out.println("Hello World!");

            }

        }).start();

    }

}

lambda方式:

public class Test {

    public static void main(String[] args) {

        new Thread(() -> System.out.println("Hello World!")).start();

    }

}

这里通过lambda表达式实现了Runnable接口,避免了代码冗长。

二、函数式接口

函数式接口是一种只包含一个抽象方法的接口。Java 8中提供了一些函数式接口,如Function、Consumer、Predicate等,这些接口都有一个特点,就是只包含一个抽象方法。这些接口提供了一种通用的模式,使得开发者可以在不同的场景下使用函数式接口,从而简化代码实现和提升代码可读性。示例:

普通方式:

public interface MyFilter {

    boolean filter(Integer num);

}

public class Test {

    public static void main(String[] args) {

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

        List<Integer> newList = new ArrayList<>();

        MyFilter myFilter = new MyFilter() {

            @Override

            public boolean filter(Integer num) {

                return num % 2 == 0;

            }

        };

        for (Integer num : list) {

            if (myFilter.filter(num)) {

                newList.add(num);

            }

        }

        System.out.println(newList);

    }

}

lambda方式:

public class Test {

    public static void main(String[] args) {

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

        List<Integer> newList = new ArrayList<>();

        list.stream().filter(num -> num % 2 == 0).forEach(newList::add);

        System.out.println(newList);

    }

}

这里通过Java8中提供的函数式接口Predicate和Stream完成了过滤功能。

三、lambda表达式和函数式接口的应用

1. lambda表达式实现排序

普通方式:

public class Test {

    public static void main(String[] args) {

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

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

            @Override

            public int compare(Integer o1, Integer o2) {

                return o1 - o2;

            }

        });

        System.out.println(list);

    }

}

lambda方式:

public class Test {

    public static void main(String[] args) {

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

        Collections.sort(list, (o1, o2) -> o1 - o2);

        System.out.println(list);

    }

}

2. lambda表达式实现多线程

普通方式:

public class MyThread extends Thread {

    @Override

    public void run() {

        System.out.println("MyThread is running!");

    }

}

public class Test {

    public static void main(String[] args) {

        new MyThread().start();

    }

}

lambda方式:

public class Test {

    public static void main(String[] args) {

        new Thread(() -> System.out.println("LambdaThread is running!")).start();

    }

}

3. lambda表达式实现forEach

普通方式:

public class Test {

    public static void main(String[] args) {

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

        for (Integer num : list) {

            System.out.println(num);

        }

    }

}

lambda方式:

public class Test {

    public static void main(String[] args) {

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

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

    }

}

结语

lambda表达式和函数式接口是Java中非常实用的特性,在Lambda表达式中传递的函数式接口可以提高代码的简洁性和可读性,同时引发更深层次的思考。在实际开发过程中,合理运用这些特性,使得代码更简单、高效,会大大提高个人及团队的开发效率。