[2017.02.23] Java8 函数式编程

时间:2022-06-17 20:44:07

以前学过Haskell,前几天又复习了其中的部分内容。
函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list、map、set,以及在这些数据结构上的专门定制化操作,来实现代码的复用。同时函数式编程有惰性求值、高阶函数、柯里化、Point-free等风格,常用的几个函数式风格的操作有 map、filter、reduce/foldr/foldl 等。 Haskell是一种纯函数式编程语言,函数没有副作用。而Python语言和Java8等则是多范式编程语言,提供了部分的函数式编程的实现。
今天阅读《Java8 函数式编程 (Java 8 Lambdas: Functional Programming for the Masses)》的前几章,编写一个简单的小程序,尽量更多地使用和测试Java8中的lambda表达式、Stream流操作、惰性求值等函数式编程风格。
PS. 最近读了不少的书籍,很多书对自己真正有用的部分真的不多。曾经傻啦吧唧地拿到一本书从头到尾没有重点地看,时间没少花费,效果却差强人意。阅读呀,有时候还是要带着目的去读,不管是不是功利性地,只要能够学得快记得牢用得好,过程都不是问题!


/**
 * Created by auss on 17-2-23.
 */

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World!");
        test_lambda();
    }

    public static void test_lambda() {
        List<Integer> ilist = Stream.of(Arrays.asList(1, 2, 3, 4, 5), Arrays.asList(6, 7, 8, 9))
                .flatMap(number -> number.stream()) // 合并,惰性求值
                .peek(value -> System.out.println(" " + value.toString())) // 遍历输出
                .collect(Collectors.toList()); //输出位list,触发及时求值操作

        Integer res = ilist.stream()  //List转化为Stream对象 stream()串行流,parallelStream()并行流
                .parallel()  //将Stream并行化处理
                .filter(value -> value % 2 != 0)  //过滤奇数
                .map((value) -> value * 3 + 1)    //乘以3,加上1
                .reduce(0, (acc, elem) -> acc + elem); // 累加求和,初始值为0,
        System.out.println("Result : " + res.toString());      // 变量的自动装线与拆箱
    }
}