JAVA8之Lambda

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类的方法,也是函数式接口 如:
JAVA8之Lambda_第1张图片
在java.util.function包下,Java8新增了好多函数式接口,如Function,Consumer,Predicate,Supplier等。

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,其他的自己感兴趣可以自己试一下

JAVA8之Lambda_第2张图片
apply 接受一个参数,返回一个值

JAVA8之Lambda_第3张图片
如果接收两个参数,返回一个值尼,用BiFunction,java.util.function这个包里还有对包装类型的处理,为了处理JAVA拆箱装箱的问题,感兴趣的可以自己去试一下

你可能感兴趣的:(java)