Lambda

A.Hello Lambda

一.从匿名类演变成Lambda表达式

1.匿名类写法
  HeroChecker c1 = new HeroChecker(){
       public boolean test(Hero h){
           return (h.hp>100 && h.damage<50)
        }
 };
2.把外面的壳子去掉只保留方法参数->方法体
 HeroChecker c2 = (Hero h)->{
      return h.hp>100 && h.damage<50;
 };
3.把return 和{}去掉
HeroChecker c3 = (Hero h)->h.hp>100 && h.damage<50;
4.把参数类型和圆括号去掉(只有一个参数时才可以去掉圆括号)
HeroChecker c4 = h->h.hp>100 && h.damage<50;
5.把c4作为参数传递进去
filter(heros,c4);
6.直接把表达式传递进去
filter(heros,h->h.hp>100&&h.damage<50)

二.匿名方法

与匿名类概念比较,Lambda其实就是匿名方法
这是一种把方法作为参数传递的编程思想
虽然代码是这么写的
 filter(heros,h->h.hp>100 && h.damage<50)
但是Java会在背后悄悄地把这些都还原成匿名类方式
引入Lambda表达式会使代码更加紧凑而不是各种接口和匿名类到处飞
弊端:
  可读性差,一旦变得比较长就难以理解
  不便于调试,很难在表达式中增加调试信息
  版本支持,JDK8以后支持

B.方法引用

1.引用静态方法
   首先为TestLambda添加一个静态方法
     public static boolean testHero(Hero h){
              return h.hp>100 && h.damage<50;
     }
     Lambda表达式中调用这个静态方法
         filter(heros,h->TestLambda.testHero(h));
         filter(heros,TestLambda::testHero);//写法二
2.引用对象方法
   与引用静态方法很类似,只是传递方法的时候需要一个对象的存在
   TestLambda testLambda = new TestLambda();
   filter(heros, testLambda::testHero);
3.引用容器中的方法
    首先为Hero添加一个方法
    public boolean matched(){
         return this.hp>100 && this.damage<50; 
   }
  filter(heros,h->h.matched());
  filter(heros,Herp::matched);//写法二
4.引用构造器
   有的接口中的方法会返回一个对象,比如java.util.function.Supplier提供了一个get方法,返回一个对象
 public interface Supplier<T>{
    T get();
 }
   设计一个方法,参数是这个接口
 public static List getList(Supplier<List> s){
       return s.get();
  } 
  为了调用这个方法有三种方式
   1.匿名类
        Supplier<List> s = new Supplier<List>(){
           public List get(){
                return new ArrayList();
               }        
           }
         List list1 = getList(s);
   2.Lambda表达式
      List list2 = getList(()->new ArrayList());
   3.引用构造器
      List list3 = getList(ArrayList::new);

C.聚合操作

1.Stream和管道的概念
 heros
   .stream()
   .filter(h -> h.hp > 100 && h.damage < 50)
   .forEach(h -> System.out.println(h.name));
Stream和Collection结构化的数据不一样, 
Stream是一系列的元素,就像生产线上的罐头一样,一串串的出来
管道是一系列的聚和操作又分为3部分
      管道源:
      中间操作:每个中间操作又会返回一个Stream。
              中间操作是懒操作,并不会进行真正的便利
      结束操作:是流的最后一个操作,当这个操作被执行完后流就被用光了,无法再被操作。
              不会返回Stream,但是会返回int,float,String,Collection或者什么都不返回。
              结束操作才进行真正的遍历,在遍历的时候才会去进行中间操作的相关判断
2.管道源
  把Collection切换成管道源很简单,调用stream()就行了
 heros.stream()
 但是数组却没有stream()方法,需要使用
   Arrays.stream(hs)或者Stream.of(hs)   
3.中间操作
 主要分为两类,对元素进行筛选和转换成其他形式的流
 对元素进行筛选:
     filter  匹配
     distinct 去除重复(根据equals判断)
     sorted 自然排序
     sorted(Comparator<T>) 指定排序
     limit 保留
     skip 忽略
转换为其他形式的流
    mapToDouble  转换成double的流
    map   转换成任意类型的流
4.结束操作
   常见结束操作如下:
      forEach() 遍历每个元素
      toArray() 转换为数组
      min(Comparator<T>) 取最小的元素
      max(Comparator<T>) 取最大的元素
      count() 总数
      findFirst() 第一个元素
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容