zoukankan      html  css  js  c++  java
  • 快速了解Lambda表达式-Java

    lambda表达式

    前言

    最近因为疫情,也不能正常返校什么的,希望大家都能好好的,希望武汉加油,中国加油,在家也看了很多视频,学了一点新的东西,虽然懒惰,但是也要努力啊。今天记录分享Lambda表达式的知识。

    Lambda表达式是JDK8新增的特性 下面的图就是JDK8的新特性,JDK5和JDK8相对来说都是比较重要有的Java版本。

    所以学习使用其中的新特性也是比较重要的。

    简介

    Lambda表达式指的是应用在单一抽象方法接口环境下的一种简化定义形式,可以用来解决匿名内部类的定义复杂问题。
    今天这篇讲的是lambda表达式,它是一种新的语法规则。它是一种匿名函数,简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。它可以写出更简洁、更灵活的代码。作为一种更紧凑简洁的代码风格,使 Java 语言的表达能力得到了提升。
    

    简单入门

    interface Message {
        public void print();
    }
    
    public class TestDemo {
        public static void main(String[] args){
            //lambda表达式,这里是覆写接口中的print方法
            fun() -> System.out.println("hello world");
           //原来的写法
           // fun(new Message(){
           //   @Override
           // public void print)() {
           //   System.out.println("hello world");
           //}
           //});
        }
    public static void print(Message msg){
        msg.print();
     }
    }
    

    用法

    • Lambda的基本语法如下

    (参数) -> 方法体/lambda体
    解析:
      	左边是成员列表/形参列表(有时就是接口中的抽象方法的方法引用)
    	右边的方法体是要重写的抽象方法的方法体
    	-> 是操作符,也叫做lambda箭头操作符
    	
    	
    
    • 简单示例

    // 1. 不需要参数,返回值为   
    () -> 1  
      
    // 2. 接收一个参数(数字类型),返回其2倍的值  
    x -> 2 * x  
      
    // 3. 接受2个参数(数字),并返回他们的差值  
    (x, y) -> x – y  
      
    // 4. 接收2个int型整数,返回他们的和  
    (int x, int y) -> x + y  
      
    // 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
    (String s) -> System.out.print(s)
    
    • 具体使用方法/写法-一共可以分为六种情况去写。

    /**
     * @Author: yhy
     * @Time: 22:37
     * 用来测试使用lambda语句
     */
    public class LambdaDemo {
    //    -> lambda操作符
    
        //    情况一:无参且无返回值
        @Test
        public void test1() {
    //        原来的写法
            Runnable r0 = new Runnable() {
                @Override
                public void run() {
                    System.out.println("abc");
                }
            };
    
    //        lambda写法
            Runnable r = () -> System.out.println("abc");
            r.run();
        }
    
        //情况二 需要一个参数,但没有返回值
    //    原始写法
        Consumer<String> con = new Consumer<>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
    
        };
    
        //    lambda写法
        Consumer<String> con2 = (String s) -> {
            System.out.println(s);
        };
    
        //情况三:数据类型省略,可推断出类,又叫做类型推断 前面已经知道是string类型了
    //    所以这里直接省略了后面的括号的string类型说明
    //    和泛型的格式很像,可以省略后面的类型说明
        Consumer<String> con3 = (s) -> {
            System.out.println(s);
        };
    
        //    情况四:一个参数的时候, 括号可以不写 下面的s就是一个参数
        @Test
        public void test2() {
            Consumer<String> con4 = s -> {
                System.out.println(s);
            };
            con4.accept("abcdefg");
        }
    
        // 情况五:需要两个或者以上的参数,且方法中多条执行语句,并且有返回值
        @Test
        public void test3() {
    //        原来的写法
            Comparator<Integer> com = new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    System.out.println(o1);
                    System.out.println(o2);
                    return o1.compareTo(02);
                }
            };
            System.out.println(com.compare(13,15));
    //        lambda表达式
            System.out.println("------------------");
            Comparator<Integer> com2 =(o1,o2) -> {
                return o1.compareTo(02);
            };
            System.out.println(com2.compare(14,12));
        }
    //    情况六:当lambda只有一条语句时候,可以在lambda体中省略括号和return
        @Test
        public void test4(){
    //        原来的写法
        Comparator<Integer> com1 = (o1,o2) -> {return o1;};
        }
    //    lambda规则六表达式写法
        Comparator <Integer> com2 = (o1, o2) -> o1;
    }
    
    

    好处

    能够简洁,快速写代码,看的出代码量差别,但是有一说一,有时不会很好懂,但是看得懂还是最基本的要求。

    总结

    表达式的左边:Lambda形参列表的参数类型可以省略,如果只有一个参数的时候,也可以省略括号

    表达式的右边:Lambda体,一对{}包裹着,只有一条执行语句的时候,也可以省略大括号,若有返回值,省略的时候也可以省略return

    最后,以前用匿名内部类的地方都可以使用Lambda表达式类代替.

    这一篇文字没写多少,因为我觉得学的太慢了,不能浪费太多时间在做博客上,所以以记录分享为主,菜鸟一枚,加油,共勉!

  • 相关阅读:
    springboot与微信开发(一)
    使用springboot+layim+websocket实现webim
    使用springboot+layim+websocket实现webim
    Spring boot WebSocket 注入失败
    使用spring boot +WebSocket的那些坑
    Scrapy 问题锦集(后边继续更新)
    mac安装并创建Scrapy项目
    mac 安装MySQL-python的坑
    IDEA/Pycharm文件头注释模板
    工作用到的正则及测试工具
  • 原文地址:https://www.cnblogs.com/yhycoder/p/12315184.html
Copyright © 2011-2022 走看看