文章内容参考自学习网站: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)集合的聚合操作
这个我将单独写一个聚合操作的随笔