• lambda表达式学习笔记


    lambda表达式特点
    • 函数式编程(接口中只有一个抽象方法)
    • 参数类型自动推断
    • 代码简洁
    lambda应用场景
    • 任何有函数式接口的地方
    函数是接口
    • Supplier 代表一个输出
    • Consumer 代表一个输入
    • BiConsumer 代表两个输入
    • Function 代表一个输入,一个输出(一般输入和输出是不同类型的)
    • UnaryOperator 代表一个输入,一个输出(一般输入和输出是相同类型的)
    • BiFunction 代表两个输入,一个输出(一般输入和输出是不同类型的)
    • BinaryOperator 代表两个输入,一个输出(一般输入和输出是相同类型的)
    @FunctionalInterface
    • 作用于接口上,判断接口是否为函数式接口
    方法引用
    • 是用来直接访问类或者实例的已经存在的方法或者构造方法,方法引用提供了一种引用而不执行方法的方式,如果抽象方法的实现恰好可以使用调用另外一个方法来实现,就有可能可以使用方法的引用
    使用lambda的意义
    • 简化代码结构且意图明显,追随函数式编程趋势
    • 多核友好
    Stream特性
    1. 不是数据结构,没有内部存储
    2. 不支持索引访问
    3. 延迟计算(懒执行)
    4. 并行执行
    5. 很容易生成数组、集合
    6. 支持过滤,查找,转换,汇总,聚合等操作
    Stream创建方式
    1. 通过数组
    2. 通过集合来
    3. 通过Stream.generate方法来创建
      4 通过Stream.iterate方法来创建
    4. 其他API创建
    实例:
    //通过数组生成
        static void gen1(){
            String[] strs = {"1","2"};
            Stream<String> strs1 = Stream.of(strs);
            strs1.forEach(System.out::println);
        }
        //通过集合生成
        static void  gen2(){
            List<String> strings = Arrays.asList("1", "2", "3");
            Stream<String> stream = strings.stream();
            stream.forEach(System.out::println);
        }
        //generate
        static void gen3(){
            Stream<Integer> generate = Stream.generate(() -> 1);
            generate.limit(10).forEach(System.out::println);
        }
        //使用iterator
        static void  gen4(){
            Stream<Integer> iterate = Stream.iterate(1, x -> x + 1);
            iterate.limit(50).forEach(System.out::println);
        }
        //其他方式
        static void gen5(){
            String str = "asdfghj";
            IntStream chars = str.chars();
            chars.forEach(System.out::println);
        }
    
    Stream常用实例:
            //取奇数
            Arrays.asList(1,2,3,4,5,6,7,8).stream().filter(x->(x+1)%2==0).forEach(System.out::println);
            //取奇数和
            int sum = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().filter(x -> (x + 1) % 2 == 0).mapToInt(x -> x).sum();
            //取最大值
            int max = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().max((a,b)->a-b).get();
            //取任何一个
            Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().findAny().get();
            //取第一个
            Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().findFirst().get();
            //取最大值,自定义
            Arrays.asList(1, 2, 3, 4, 5, 6, 7,8).stream().sorted((x1,x2)-> x2-x1).findFirst().get();
            //过滤后返回集合对象
            Arrays.asList(1, 2, 3, 4, 5, 6, 7,8).stream().filter(x->x%2==0).collect(Collectors.toList());
            //去重
            Arrays.asList(1, 2, 2, 4, 4, 6, 7,8).stream().distinct().collect(Collectors.toList());
            Arrays.asList(1, 2, 2, 4, 4, 6, 7,8).stream().collect(Collectors.toSet());
            //获取20-30数字
            Stream.iterate(1,x->x+1).skip(20).limit(10);
            //字符串求和
            String str = "11,,22,33,44,55,66";
            Stream.of(str.split(",")).mapToInt(x->Integer.valueOf(x)).sum();
            Stream.of(str.split(",")).map(x->Integer.valueOf(x)).mapToInt(x->x).sum();
            Stream.of(str.split(",")).mapToInt(Integer::valueOf).sum();
            //将str中所有数值求和并打印
            Stream.of(str.split("")).peek(System.out::println).mapToInt(Integer::valueOf).sum();
            //误区(不会有任何输出,没有终止函数,不会执行,中间过程不存储!!)
            Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8).stream().filter(x -> {
                System.out.println("代码运行");
                return (x + 1) % 2 == 0;
                }
            );
    
  • 相关阅读:
    (转)CMD指令大全
    [转]测试人员要像医生一样把要测试的程序当自己的病人一样看待一样检测!
    robotFramework学习笔记
    mysql数据库转换成数据字典的方法(整理)
    【转】PHP SQL防注入的一些经验
    性能测试基础知识(概念)
    iOS--MJRefresh的使用 上拉刷新和下拉加载
    IOS----UIScrollerView的使用
    iOS -- UILabel的高度自适应
    第二章 图像形成
  • 原文地址:https://www.cnblogs.com/fqliu/p/14778837.html
Copyright © 2020-2023  润新知