2014年3月份JAVA8发布,时至今日,我还在用着JAVA6,瞬间感觉不只是给广大程序员拖了后腿,简直就是截了肢。。
Java8主要的新特性:Lambda表达式,方法引用,流,默认方法,以及日期和时间的API
首先引入一个编程概念:行为参数化
不明白?没关系,举个栗子:
“憨憨,这有个需求,把农场的红苹果选出来准备出售”
“额,你是不是怀疑我的能力?”
“…”
很快,写出来了
public static List isFilterApple(List list){
List result = new ArrayList<>();
for (Apple apple:list) {
if("red".equals(apple.getColor())){
result.add(apple);
}
}
return result;
}
结果三天两头让你改需求,今天粉色,明天要土豪金的,终于你准备改方法了,把颜色当参数,变成了这样
public static List isFilterApple(List list,String color){
List result = new ArrayList<>();
for (Apple apple:list) {
if(color.equals(apple.getColor())){
result.add(apple);
}
}
return result;
}
没过两天,人家又要选择红色苹果达到一定重量的,然后你把代码改成了这样:
public static List isFilterApple(List list,String color,int weight,boolean flag){
List result = new ArrayList<>();
for (Apple apple:list) {
if((flag && apple.getColor().equals(color)) || (!flag && apple.getWeight()>weight)){
result.add(apple);
}
}
return result;
}
这是你已经开始意识到了,项目经理这老小子可不像个好人呀~ 随着需求的变更,这个方法已经不能很好的应对需求变化了。。
这个时候,行为参数化可以很好的解决问题
定义一个选择苹果标准的接口
public interface ApplePredicate {
boolean test(Apple apple);
}
实现
public class AppleChoosePredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor()) && apple.getWeight()>200;
}
}
方法就变成了这个样子了
public static List isFilterApple(List list, ApplePredicate a){
List result = new ArrayList<>();
for (Apple apple:list) {
if(a.test(apple)){
result.add(apple);
}
}
return result;
}
方法的调用直接是
isFilterApple(list,new AppleChoosePredicate() )
这个时候就实现了方法的参数传递的是具体的行为,而不仅仅是数值,根据需求的不同,在方法里,传递不同的实现类就行
这个时候又有一个问题 ,那我岂不是针对不同的功能写不同的实现,聪明的你肯定想到了,没错,使用内部类
isFilterApple(list, new ApplePredicate() {
@Override
public boolean test(Apple apple) {
return ;
}
})
但是匿名类还是不好,看上去很笨重,这个时候Lambda就登场了
上面例子的Lambda表达式写法:
isFilterApple(list, new ApplePredicate() {
@Override
public boolean test(Apple apple) {
return "red".equals(apple.getColor());
}
});
//Lambda写法
isFilterApple(list,(Apple apple) -> "red".equals(apple.getColor()));
Lambda怎么写?
参数列表------(Apple apple)
箭头 -------- -> 把参数列表与Lambda主题分隔开
Lambda主题 --> 动作实现
Lambda用在哪里?
在函数式接口上使用Lambda
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口上加@FunctionalInterface注解的接口,如果一个接口有且仅有一个抽象方法不加@FunctionalInterface注解也是一个函数式接口,@FunctionalInterface注解类似于@Override,加与不加没有本质影响,这里需要注意的是如果接口中有Object类的方法,也是函数式接口 如:
在java.util.function包下,Java8新增了好多函数式接口,如Function
Lambda实例
Collections.sort(list, new Comparator() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
//Lambda写法
Collections.sort(list,(o1,o2)->o1.compareTo(o2));
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}).start();
//Lambda写法
new Thread(() -> System.out.println("hello")).start();
简单举这两个吧,比较常见,最主要是自己多理解一下,简单讲一下java.util.function下的Function
如果接收两个参数,返回一个值尼,用BiFunction