以前我给过一个例子,查询地图的参数变成了 SOLR 的搜索字符串。在 Java 8 之前的代码使用传统的for循环条件和使用StringBuilder 逐步构建一个字符串。Java 8 代码使用 map 实体,映射(转换)每一个实体变成字符串形式"key:value" ,并最终使用了 Collector 加入这些查询片段。这是一个常见的函数式代码,一个 for 循环将一个对象集合转换成不同的对象集合,过滤也是可选的,并选择性地减少单个元素的集合。在函数风格上,map,filter,reduce 等等都是一些通用的模式。你可以总是用条件过滤代替一个 for 循环,减少 Java 8 的 map, filter 和 reduce (collect) 等操作。
|
而除了 stream API 之外, Java 8 也引入了一些新的 API 方法,它们可以让某些东西简单许多,很不错。例如,假设我们要有下面这样一个方法来移除一个给定的键值的集合中所有的映射项。在示例代码中,dataCache 是一个 ConcurrentMap,而deleteKeys 是我们将要从缓存中移除的键值的集合。下面是我遇到过的采用原始方法实现的代码:
现在,你可能会说有更好的方法来做这件事情。比方说对要删除的键值进行迭代,然后使用 Map#remove(Object key) 方法将每一个映射移除。例如:
尽管功能上是对等的,但代码中使用
|
||||||
如你所见,我们首先通过
在上述代码中,我们用一个 lambda 表达式替换了匿名类,它会接收一个
这段代码比原来使用 所以实际上在功能方面是没有区别的。不过 |
例如,在需要将一个集合中不同位置的元素删除的时候,很可能会在不同的地方写出类似的遍历循环,其中还掺杂着删除逻辑。但是 在诸如此类的情况下,我认为责任分离是函数式编程优于命令式编程的一个重要原因。责任分离会产生更好、更清晰的代码和更方便的代码精确重用,因为责任都是分别实现的,同时测试也是分离的,也就意味着不仅有更清晰的生产代码,也有更清晰的测试代码。所有这些都带来更易维护的代码,也就意味着新特性和对已有代码的改进将会完成的更快,对已有代码的破坏也会更低。直到本系列下一篇关于Java 8特性和函数式编程的文章之前,请快乐编程! |
本文转自:开源中国社区 [http://www.oschina.net]
本文标题:Java 新特性,使用 Lambdas 表达式作为 Predicates
本文地址:https://www.oschina.net/translate/towards-more-functional-java-using-lambdas-as-pred
参与翻译:leoxu, 无若, debugging, xufuji456
英文原文:Towards More Functional Java Using Lambdas as Predicates