Java函数式编程(Lambda表达式)小记

函数式编程

函数式编程(Functional Programming)是编程范式的一种。最常见的编程范式是命令式编程(Impera Programming),比如面向过程、面向对象编程都属于命令式编程,大家用得最多、最熟悉。函数式编程并非近几年的新技术或新思维,其诞生已有50多年时间。

在函数式编程里面,一切都是数学函数。当然,函数式编程语言里也可以有对象,但这些对象是不可变的——要么是函数参数要么是返回值。函数式编程语言里没有for等循环,而是通过递归、把函数当成参数传递的方式实现循环效果。

简而言之,函数式编程的特点:一切皆函数(称算子?)、一切数据皆不可变,一切计算都是函数作用在不可变数据上产生新不可变数据的过程。

Java 8函数式编程

Java 8开始支持函数式编程,其是通过Lambda表达式语法来支持的。

Lambda表达式可以看成是对 特定接口的匿名实现类语法 的简写,这里的“特定接口”是指该接口须只有一个抽象方法或接口,称作函数式接口

Lambda表达式可作为函数的参数,可见,相当于向函数传递了个算子。示例:

new Thread(new Runnable() {
    @Override
    public void run() {

    }
});//通过匿名内部类创建Runnable接口实现类作为Thread的参数

new Thread(() -> {

});//通过Labmda表达式创建Thread的参数

Java 8中定义了一组常用的函数式接口(java.util.function包下):

 这些函数式接口结合Java 8中引入的Stream一起使用能够可以很大程度提高编码效率。

Java 8 Stream

Java 8 API添加了新的抽象Stream(这里的Stream不是IO中的流),可以让我们以声明的方式处理数据。这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,如筛选、排序、聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

示例:

List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
// 获取空字符串的数量
long count = strings.stream().filter(string -> string.isEmpty()).count();

Stream“以声明的方式处理数据”,其提供了一系列操作,主要有:

filter

map

flatMap

reduce(虽也提供了max、min、count,但这些均可由reduce实现等价效果)

collect

java.util.stream.Collectors下还提供了很多操作,如:

joining

groupingBy //可分为多组

partitioningBy //只能分为两组

toList

summingDouble

在使用时,就是通过为这些操作指定Lambda表达式(亦可称算子或函数?)来指定操作逻辑的。示例:

//reduce
Integer reduce = Stream.of(1, 2, 3, 4).reduce(0, (acc, x) -> acc+ 1);//相当于count

//map
        List<Student> students = new ArrayList<>(3);
        students.add(new Student("路飞", 22, 175));
        students.add(new Student("红发", 40, 180));
        students.add(new Student("白胡子", 50, 185));

        List<String> names = students.stream().map(student -> student.getName())
                .collect(Collectors.toList());

//flateMap
List<Student> students = new ArrayList<>(3);
        students.add(new Student("路飞", 22, 175));
        students.add(new Student("红发", 40, 180));
        students.add(new Student("白胡子", 50, 185));

        List<Student> studentList = Stream.of(students,
                asList(new Student("艾斯", 25, 183),
                        new Student("雷利", 48, 176)))
                .flatMap(students1 -> students1.stream()).collect(Collectors.toList());

//groupingBy
Map<SpecialityEnum, List<Student>> listMap = 
    students.stream().collect(
    Collectors.groupingBy(student -> student.getSpecialities().get(0)));


//joining
List<Student> students = new ArrayList<>(3);
students.add(new Student("路飞", 22, 175));
students.add(new Student("红发", 40, 180));
students.add(new Student("白胡子", 50, 185));

    String names = students.stream()
        .map(Student::getName).collect(Collectors.joining(",","[","]"));

参考资料:

https://www.cnblogs.com/snowInPluto/p/5981400.html

猜你喜欢

转载自www.cnblogs.com/z-sm/p/11926913.html