函数式编程
函数式编程(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
原文地址:https://www.cnblogs.com/z-sm/p/11926913.html