zoukankan      html  css  js  c++  java
  • 二 lambda表达式

    1:lambda写的好可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

     2: lambda表达式配合Java8新特性Stream API可以将业务功能通过函数式编程简洁的实现.

    3: lambda表达式语法:

    一般语法:

    (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
      statment1;
      statment2;
      //.............
      return statmentM;
    }

    单参数语法:
    param1 -> {
      statment1;
      statment2;
      //.............
      return statmentM;
    }

    单语句写法: 可以省略大括号、return和语句结尾的分号
    param1 -> statment

    方法引用写法:
    Class or instance :: method

    4:lambda表达式中的this概念
    在lambda中,this不是指向lambda表达式产生的那个SAM对象,而是声明它的外部对象
    5:lambad表达式语法糖
    execStrs.forEach(System.out::println);
    6:System.out::println等同于x->System.out.println(x);
    Math::max等同于(x, y)->Math.max(x,y)
    String::toLowerCase等同于x->x.toLowerCase()
    BigDecimal::new等同于x->new BigDecimal(x)
    7:stream语法
    两句话理解Stream:
      A.Stream是元素的集合,这点让Stream看起来用些类似Iterator;
       B.可以支持顺序并行的对原Stream进行汇聚的操作;
    包装后的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,
    具体这些操作如何应用到每个元素上,就给Stream就好了!原先是人告诉计算机一步一步怎么做,现在是告诉计算机做什么,计算机自己决定怎么做。
    当然这个“怎么做”还是比较弱的。

      List<Integer> nums = Lists.newArrayList(1,null,3,4,null,6);
      nums.stream().filter(num -> num != null).count();

          上面这段代码是获取一个List中,元素不为null的个数。这段代码虽然很简短,但是却是一个很好的入门级别的例子来体现如何使用Stream,正所谓“麻雀虽小五脏        俱全”。我们现在开始深入解刨这个例子,完成以后你可能可以基本掌握Stream的用法!

                           

      图片就是对于Stream例子的一个解析,可以很清楚的看见:原本一条语句被三种颜色的框分割成了三个部分。红色框中的语句是一个Stream的生命开始的地        方,负责创建一个Stream实例;绿色框中的语句是赋予Stream灵魂的地方,把一个Stream转换成另外一个Stream,红框的语句生成的是一个包含所有nums变量的Stream,进过绿框的filter方法以后,重新生成了一个过滤掉原nums列表所有null以后的Stream;蓝色框中的语句是丰收的地方,把Stream的里面包含的内容按照某种 算法来汇聚成一个值,例子中是获取Stream中包含的元素个数。

            使用Stream的基本步骤:

            A.创建Stream;
            B.转换Stream,每次转换原有Stream对象不改变,返回一个新的Stream对象(**可以有多次转换**);
            B.对Stream进行聚合(Reduce)操作,获取想要的结果;

    8: 如何得到stream呢:
    8.1 使用stream的静态方法:
    Stream<Integer> integerStream = Stream.of(1, 2, 3, 5);
    Stream<String> stringStream = Stream.of("taobao");
    8.2 generator方法:

        Stream.generate(new Supplier<Double>() {
            @Override
            public Double get() {
                 return Math.random();
              }
          });

        Stream.generate(() -> Math.random());
        Stream.generate(Math::random);

       8.3 iterator方法:
    Stream.iterate(1, item -> item + 1).limit(10).forEach(System.out::println);
    8.4
    通过Collection子类获取Stream(最常用)
    9 转换Stream(这里列出常用的一些方法):
    distinct:(去重,去重的逻辑依赖于元素的equals方法)
    filter:
    map:对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。
    这个方法有三个对于原始类型的变种方法,分别是:mapToInt,mapToLong和mapToDouble。
    这三个方法也比较好理解,比如mapToInt就是把原始Stream转换成一个新的Stream,
    这个新生成的Stream中的元素都是int类型。之所以会有这样三个变种方法,可以免除自动装箱/拆箱的额外消耗。
    flatMap:flatMap 把 input Stream 中的层级结构扁平化,就是将最底层元素抽出来放到一起。
       Stream<List<Integer>> inputStream = Stream.of(
      Arrays.asList(1),
      Arrays.asList(2, 3),
       Arrays.asList(4, 5, 6)
        );
        Stream<Integer> outputStream = inputStream.
    flatMap((childList) -> childList.stream());
    outputStream.forEach(x->System.out.print(x)); // 123456
    limit: 截断
    skip:
    10 待续


  • 相关阅读:
    GitHub 的企业版
    我的Tag列表
    .net开发者对android开发一周的学习体会
    Ajax简单聊天B/S
    C#设计模式——享元模式(Flyweight Pattern)
    mongodb的sharding架构搭建
    Java设计模式
    LMAX架构
    Winform开发的常用类库
    C#设置本地网络(DNS、网关、子网掩码、IP)
  • 原文地址:https://www.cnblogs.com/liufei1983/p/8299466.html
Copyright © 2011-2022 走看看