为了账号安全,请及时绑定邮箱和手机立即绑定

lambda

标签:
C++

一、引入lambda

定义:lambda就是简化了匿名内部类

使用前提:安装JDK 8

通过一个Example一步一步来达到lambda表达式的相关 :

筛选出集合内大于50的数
  • 普通Java代码实现

  public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();        for (int i = 0; i < 10; i++) {
            Random random = new Random();            int nextInt = random.nextInt(100) + 1;
            list.add(nextInt);
        }
        System.out.println("原:" + list);
        System.out.println("筛选出大于50的数");
        filter(list);
    }    
    public static void filter(List<Integer> list) {        for (Integer integer : list) {            if (integer > 50) {
                System.out.println(integer);
            }
        }
    }
  • 匿名类部类实现

  public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();        for (int i = 0; i < 10; i++) {
            Random random = new Random();            int nextInt = random.nextInt(100) + 1;
            list.add(nextInt);
        }
        System.out.println("原:" + list);
        
        Checker checker = new Checker() {            @Override
            public boolean check(Integer i) {                return i > 50;
            }
        };
        filter(list, checker);
    }    public static void filter(List<Integer> list, Checker checker) {        for (Integer integer : list) {            if (checker.check(integer)) {
                System.out.println(integer);
            }
        }
    }    // Checker接口
    public interface Checker {        public boolean check(Integer i);
    }
  • 一步一步演变成lambda表达式

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();        for (int i = 0; i < 10; i++) {
            Random random = new Random();            int nextInt = random.nextInt(100) + 1;
            list.add(nextInt);
        }
        Checker c1 = new Checker() {            @Override
            public boolean check(Integer i) {                return i > 50;
            }
        };
        System.out.println("筛选出大于50的数--->1");
        filter(list, c1);
        
        Checker c2 = (Integer i) -> { return i > 50; };
        System.out.println("筛选出大于50的数--->2");
        filter(list, c2);
        
        Checker c3 = (Integer i) -> i > 50;
        System.out.println("筛选出大于50的数--->3");
        filter(list, c3);
        
        Checker c4 = i -> i > 50;
        System.out.println("筛选出大于50的数--->4");
        filter(list, c4);
        
        System.out.println("筛选出大于50的数--->5");
        filter(list, i -> i > 50);
        
        List<Integer> is = list.stream().filter(i -> i > 50).collect(Collectors.toList());
        System.out.println(is);
    }    
    public static void filter(List<Integer> list, Checker checker) {        for (Integer integer : list) {            if (checker.check(integer)) {
                System.out.println(integer);
            }
        }
    }
总结
1.匿名类的正常写法
    Checker checker = new Checker() {        @Override
        public boolean check(Integer i) {            return i > 50;
        }
    };
2. 把外面的壳子去掉,只保留方法参数和方法体,参数和方法体之间加上符号 ->
    Checker c2 = (Integer i) -> { return i > 50; };
3. 把return和{}去掉
    Checker c3 = (Integer i) -> i > 50;
4. 去掉参数小括号,得到Lambda表达式
    Checker c4 = i -> i > 50;

排序例子

    //TODO 匿名类部类
    Collections.sort(list, new Comparator<String>() {        @Override
        public int compare(String o1, String o2) {            return o1.compareTo(o2);
        }
    });    
    // TODO lambda表达式
    Collections.sort(list, (o1, o2) -> o1.compareTo(o2));

二、聚合操作

遍历: 传统方式与聚合操作遍历数据

    List<Integer> list = new ArrayList<>();
    Random random = new Random();    for (int i = 0; i < 10; i++) {        int nextInt = random.nextInt(100) + 1;
        list.add(nextInt);
    }    
    // TODO 传统方式for循环遍历数据
    for (Integer itg : list) {        if (itg > 50) {
            System.out.println(itg);
        }
    }    
    // TODO 聚合操作遍历数据
    list.stream().filter(itg -> itg > 50).forEach(itg -> System.out.println(itg));    
    // TODO lambda的方法引用(简介: 静态方法、对象方法等等的引入)
    list.stream().filter(itg -> itg > 50).forEach(System.out::println);

Stream和管道的概念

  1. Stream: Stream是一系列元素, 象生产线上的罐头, 一罐一罐的生产出来

  2. 管道: 是指一系列聚合操作, 分为:管道源、中间操作、结束操作。

管道源:在前面的例子里面,管道源是list集合

  • 将Collection切换到管道源只需要调用stream()方法即可:

    list.stream();
  • 数组却没有stream()方法,需要使用:

    int[] arr = {1, 2, 3, 4};
    Arrays.stream(arr).forEach(System.out::println);

中间操作:也叫‘懒’操作,并不会进行变量,每一步中间操作都会返回一个Stream对象

  • 对元素进行筛选

    • filter        匹配

    • distinct   去除重复(根据equals判断)

    • sorted         自然排序

    • sorted(Comparator<T>) 指定排序

    • limit 保留

    • skip 忽略

  • 转换为其他形式的流

    • mapToDouble 转换为double的流

    • map 转换为任意类型的流

    //TODO 去重排序打印
    list.stream().distinct().sorted().forEach(System.out::println);    
    //TODO 保留前三个元素并打印
    list.stream().limit(3).forEach(System.out::println);    
    //TODO 忽略前三个
    list.stream().skip(3).forEach( System.out::println);    
    //TODO 转换任意类型的Stream
    list.stream().map(itg -> itg + "-hello").forEach( System.out::println);

结束操作: 结束操作不会返回Stream,但是会返回int、float、String、 Collection或者像forEach或者什么都不返回

  • forEach() 遍历每个元素

  • toArray() 转换为数组

  • min(Comparator<T>) 取最小的元素

  • max(Comparator<T>) 取最大的元素

  • count() 总数

  • findFirst() 第一个元素

  // 遍历集合中的每个数据
  list.stream().forEach(h->System.out.print(h));  // 返回一个数组
  Object[] array= list.stream().toArray();  // 返回最小值
  Integer integer = list.stream().min((a1, a2) -> a1.compareTo(a2)).get();  // 返回最大值
  Integer integer = list.stream().max((a1, a2) -> a1.compareTo(a2)).get();  

  // 数据的总数
  long count = list.stream().count();  // 第一个元素
  Integer integer = list.stream().findFirst().get();



作者:竹子_JT
链接:https://www.jianshu.com/p/e5b27763200f


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消