Lambda表达式

 

文章内容参考自学习网站:how2java.cn

总结参考自博客:https://www.cnblogs.com/franson-2016/p/5593080.html

(1)一般我们在筛选满足条件的对象的时候会创建普通方法,用一些判断语句来筛选,如:

private static void filter(List<Hero> heros){
        for(Hero hero:heros){
            if(hero.getAge()>50 && hero.getId()<400)
                System.out.print(hero);
        }
    }

 

(2)或者通过匿名类方式,就像Collections.sort()方法中,传递一个比较器进去,来进行排序。

HeroChecker checker = new HeroChecker() {
            @Override
            public boolean test(Hero hero) {
                return hero.getAge()>50 && hero.getId()<400;
            }
        };
private static void filter(List<Hero> heros,HeroChecker checker){
        for(Hero hero:heros){
            if(checker.test(hero))
                System.out.print(hero);
        }
    }

 

(3)而Lambda表达式则是匿名类方式的更加简化版本,简化到只剩下传入参数和返回值

            其简化过程如下:

            1.首先我们看到匿名类的形式是:

HeroChecker checker = new HeroChecker() {
            @Override
            public boolean test(Hero hero) {
                return hero.getAge()>50 && hero.getId()<400;
            }
        };

            2.然后我们去掉匿名类的外壳:     这时可以看做参数hero作为Hero类型 传入到匿名类中,然后返回对参数h进行的相关操作结果

HeroChecker checker = (Hero hero)-> {
                return hero.getAge()>50 && hero.getId()<400;
        };

            3.进一步去掉大括号和return:         这时就会比较抽象了,但是依然能清楚逻辑

HeroChecker checker = (Hero hero) -> hero.getAge()>50 && hero.getId()<400;

             4.我们更进一步地去掉参数类型:

HeroChecker checker = hero-> hero.getAge()>50 && hero.getId()<400;

            5.将筛选条件传递进过滤器中

这时我们依然可以像上面一样将checker传递进filter中进行筛选操作,或者直接将整个Lambda表达式传递进filter

 HeroChecker checker = hero->hero.getAge()>50 && hero.getId()<400;
 filter(heros,checker);

//或者直接将Lambda表达式传入
filter(heros , hero->hero.getAge()>50 && hero.getId()<400);

 

二.总结一下:

     1.Lambda表达式的语法
                            基本语法:
                                           (parameters) -> expression
                            或
                                           (parameters) ->{ statements; }

测试用例:

// 1. 不需要参数,返回值为常数  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

       

           2.应用场景:

          (1)List遍历:  当我们有一个表需要进行遍历操作时,可以通过Lambda表达式来简化代码

List<Hero> heros = new ArrayList<>();
heros.forEach(hero-> System.out.println("Hero's Name:"+hero.getName()));

          (2)多线程中的Runnable接口实现: 

new Thread(()-> System.out.println("Thread start")).start();

或者

Runnable runnable = ()-> System.out.println();

          (3)集合的Comparator接口:

Comparator<Hero> cp = (Hero o1,Hero o2)->(o1.compareTo(o2));

当然,上面这个需要在Hero类中应用Comparable接口,实现compareTo()方法,如果想简单粗暴地比较别的东西,就如下:

Comparator<Hero> cp = (o1,o2)->(o2.getAge()-o1.getAge());

           (5)集合的聚合操作

这个我将单独写一个聚合操作的随笔

posted @ 2019-03-19 16:25  胡叁安  阅读(168)  评论(0编辑  收藏  举报