今天学习有关变换式编程的内容,先看提示:
提示49:编程讲的是代码,而程序谈的是数据。
提示50:不要囤积状态,传递下去。
作者举例说明了所有程序其实都是对数据的一种变换。然后每个变换都从前一个变换获取输入并将输出传递给下一个变换。这样就能避免将数据封装在对象中来回折腾,减少了很多耦合。作者强调了在这个过程中,我们要传递状态,当应用程序将其输入转
换为输出时,可以自由地表达自己的展开过程。一个函数可以在任何地方使用(并重用),只要其参数与其他函数的输出相匹配。
感觉这一章作者主要表达的就是函数式编程。自从Java8引入stream以后,java也可以使用管道来编写代码。作者在文中已经详细介绍了这样面向过程编程的好处,减少了耦合,方便复用等等,我自己在平时的代码中也经常使用。但这并不意味着stream是万能的,我感觉它最大的优势在于每个函数的输入输出都非常清楚,没有副作用,而且单个函数构造简单,方便测试,但是缺点也很明显。了应对日益变更的需求,有可能需要不断的有高阶函数来包装之前已经存在的 简单函数,多层包装之后大大增加了代码复杂度从而将代码变得难以维护和可读性差。拿个最简单的举例,我上次使用的那个方便很多地方复用的function,已经让黎叔直呼看不懂了。当函数太抽象以后说不定会起到反作用,所以具体如何使用还是需要我们做好取舍。
private static <T> Predicate<T> distinctByKey(Function<? super T, String> function) {
Set<String> set = ConcurrentHashMap.newKeySet();
return t -> set.add(function.apply(t));
}
网友评论