• java8新特性之Lambda表达式


    一、Lambda 表达式的基础语法

    java8中引入了一个新的操作符‘->’该操作符称为箭头操作符或lambda操作符,箭头操作符将Lambda表达式拆分成两部分

    左侧:lambda表达式的参数列表
    右侧:lambda表达式中所需执行的功能,即Lambda代码块

    lambda表达式其实就是java的语法糖,最后运行的代码还会转换成平时的格式编译运行。只是写的格式较为简单。
    //语法格式一
    对于没有参数,没有返回值的函数式接口
    什么是函数式接口?
    接口中只有一个抽象方法称为函数式接口。可以使用注解@FunctionalInterface修饰,可以检查这个接口是否是函数式接口。

        @Test
        public void test1(){
            //首先是匿名内部类输出语句
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Hello Lambda!");
                }
            };
    
            runnable.run();
            System.out.println("----------------------");
            //lambda表达式输出
            Runnable r = () -> System.out.println("Hello Lambda!");
    
            r.run();
        }
    

    可以看到使用lambda表达式代码简洁了不少

    //语法格式二:只有一个参数,无返回值的方法,若只有一个参数,这个参数前后的()可以省略

    @Test
    public void test2(){
        Consumer<String> consumer = (x)-> System.out.println(x);
        consumer.accept("study java program hardly");
    }
    

    //语法格式三:有多个参数,有返回值,并且lambda函数块中有多条语句

     @Test
        public void test3(){
            Comparator<Integer> comparator = (x,y)->{
                System.out.println("比较两个integer数的大小");
                return Integer.compare(x,y);
            };
    
            int i = comparator.compare(13, 17);
            System.out.println(i);
        }
    

    //语法格式四:如果在多个参数的情况下有返回值且函数块中只有一条语句,那么return,{}都可以省略

    
        @Test
        public void test4(){
            Comparator<Integer> comparator = (x,y)-> Integer.compare(x,y);
        }
    
    **//语法格式五:Lambda表达式的参数列表上的参数类型可以省略,
    // 当省略后,JVM编译器通过上下文推断出数据类型,“类型推断”,当然如果加上的话所有参数都要添加类型**
    
        @Test
        public void test5(){
            Comparator<Integer> comparator = (Integer x,Integer y)-> Integer.compare(x,y);
    
        }
    
    二、Java8四大核心函数式接口

    Consumer: 消费型接口
    方法: void accept(T t);

    Supplier: 供给型接口
    方法:T get();

    Function<T,R>: 函数式接口
    方法:R apply(T t); //返回值是R类型

    Predicate: 断言型接口
    方法:boolean test(T t);

    1. 消费型接口Consumer

    /**
         * 消费型接口测试
         */
        @Test
        public void test1() {
    
            happy(100, (m) -> System.out.println("消费:" + m + "元"));
    
        }
    
        public void happy(double money, Consumer<Double> consumer) {
            consumer.accept(money);
        }
    

    供给型接口

    /**
       * 供给型接口测试
       */
      @Test
      public void test2() {
    
          //随机产生10个0--100的随机数
          List<Integer> nums = getNums(10, () -> (int) (Math.random() * 100));
          for (Integer num : nums) {
              System.out.println(num);
          }
      }
    
      public List<Integer> getNums(int n, Supplier<Integer> supplier) {
          List<Integer> list = new ArrayList<>();
    
          for (int i = 0; i < n; i++) {
              Integer num = supplier.get();
              list.add(num);
          }
    
    
          return list;
      }
    

    函数式接口

    /**
         * 函数式接口测试
         */
        @Test
        public void test3() {
    
            String str = "			啦啦啦   ";
            String s1 = strHandler(str, (s) -> s.trim());//去掉字符串前后空格
            System.out.println(s1);
            String s2 = strHandler("ajhfdsa", (s) -> s.toUpperCase());//转大写
            System.out.println(s2);
        }
    
    
        //处理字符串
        public String strHandler(String str, Function<String, String> fun) {
    
            return fun.apply(str);
        }
    

    断言式接口

    /**
         * 断言型接口测试
         */
        @Test
        public void test4() {
    
            List<String> list = Arrays.asList("Hello", "test", "class", "happy", "functional");
            List<String> stringList = filterStr(list, (s) -> s.length() > 4);
            for (String s : stringList) {
                System.out.println(s);
            }
    
        }
    
        //将满足条件的字符串放入集合中返回
        public List<String> filterStr(List<String> list, Predicate<String> predicate) {
            List<String> stringList = new ArrayList<>();
    
            for (String s : list) {
                if (predicate.test(s)) {
                    stringList.add(s);
                }
            }
            return stringList;
        }
    
    
  • 相关阅读:
    CSS 实现图片灰度效果
    有关楼层滚动且对应楼层Nav导航高亮显示
    本地上传图片预览效果
    gulp.js 的安装以及使用
    ReactJS -- 初学入门
    ie8下jquery改变PNG的opacity出现黑边
    数据库操作 (4-3)
    Python之协程 (4-2)
    python 之 线程 3-29
    Python之 并发编程(3-19)
  • 原文地址:https://www.cnblogs.com/dataoblogs/p/14121972.html
Copyright © 2020-2023  润新知