前言
《Java8实战》不得不说是一本好书,捧起来看起来就兴奋得不想放下,其中介绍的函数式编程实在是太令人兴奋了,不仅仅大大提高了代码的可读性,而且提高了代码的重用性,并且语法简单。
Java 8中新增的功能是自Java 1.0发布以来18年以来,发生变化最大的一次。我本身没有太大的体会,但新增的这些功能,每一个都让我兴奋,这里就书中的内容简单的介绍一下Java 8的这些新特性,我相信很快,你也会有跟我一样的感受。
(1)用行为参数化把代码传递给方法
Java 8中增加了通过API来传递代码的能力,但这实在听起来太绕了,这到底在说什么!打个比方或许要容易理解一些,你想要写两个只有几行代码不同的方法,那现在你只需要把不同的那部分代码作为参数传递进去就可以了。
在Java 8中,这样做起来(不止于匿名类)远远比你想象的要来得更加清晰、简洁。行为参数化
我们现在来考虑这样一个例子:有个应用程序是帮助农民了解自己的库存的,这位农民可能想有一个查找库存中所有绿色苹果的功能。但到了第二天,他可能会告诉你:“其实我还想找出所有重量超过150克的苹果”。又过了两天,他可能会继续补充道:“要是我可以找出所有既是绿色,重量也超过150克的苹果,那就太棒了。”
想一下你应该如何应对这样不断变化的需求呢?理想的状态下,你应该把你的工作量降到最小,此外类似的新功能实现起来还应该很简单,而且易于长期维护。
第一次尝试:筛选绿苹果
第一个解决方案可能是下面这样的:
public static List<Apple> filterGreenApples(List<Apple> inventory){
List<Apple> result = new ArrayList<>();
for(Apple apple: inventory){
if( “green”.equals(apple.getColor()) {
result.add(apple);
}
} // end for
return result;
}
这样的代码看起来似乎也没什么问题,也很容易看懂,但是现在农民改主意了,他还想要筛选红苹果,又该怎么做呢?简单的方法就是复制这个方法,然后把函数名称和if判断的条件来分别匹配到红苹果上就可以了。然而,要是农民想要筛选出多种颜色:浅绿色,暗红色、黄色等,这种方法就应付不了了。一个良好的原则是在编写类似的代码之后,尝试将其抽象化。
第二次尝试:把颜色作为参数
一种做法是给方法加一个参数,把颜色变成参数,这样就灵活地适应了变化:
public static List<Apple> filterApplesByColor(List<Apple> inventory,String color){
List<Apple> result = new ArrayList<>();
for(Apple apple: inventory){
if(apple.getColor().equals(color)){
result.add(apple);
}
} // end for
return result;
}
现在,只要像下面这样调用方法,农民朋友就会满意了:
List<Apple> greenAppl