java8 新特性 Lambda

本文深入探讨了Java 8中的Lambda表达式,包括其基本语法、内置函数式接口的应用及方法引用等内容,帮助读者理解如何利用这些新特性提高代码效率。

Lambda

Lambda,表达式是jdk1.8 推出的新特性(语法糖),也可称为闭包,可以快速实现函数式接口方法,配合系统内置的函数式接口,代码会更简洁,增强可读性

1. 函数式接口
  • 接口内只有一个抽象方法的接口称为函数式接口

  • 函数式接口可以使用@FunctionalInterface 标注

  •   @FunctionalInterface
      interface MyFunctionalInterface {
          public int fun();
      }
    
2. Lambda基本语法
  1. 基本结构
    1. ->’ 操作符
      • java 8 新增的符号,箭头操作符,Lambda 操作符 ,将表达式分为两部分 ParameterList->FunctionBody
    2. 参数列表
      • 箭头符号的左边部分 参数列表可以省略参数类型
    3. 方法体
      • 方法体中 是对抽象方法的实现
  2. 基本语法

    1. 无参数无返回值

      •   @Test
          public void lambdaTest1() {
              Runnable r=()-> System.out.println('a');
              r.run();
          }
        
    2. 无参数有返回值

      • 函数式接口

        •   @FunctionalInterface
            interface MyFunctionalInterface {
                public int fun();
            }
          
      • 测试

        •   @Test
            public void lambdaTest2()
            {
                int a=11;
                fun(a,()->a+1);
                //使用Lambda 表达式快速实现函数式接口
            }
            
            void fun(int a,MyFunctionalInterface functionalInterface)
            {
               int b= functionalInterface.fun();
                System.out.println(b);
            }
          
    3. 有参数有返回值

      •   @Test
          public void lambdaTest3()
          {
          
              Integer a=10;
              Integer b=2;
                  Comparator<Integer> comparator=(x,y)->{
                      System.out.println(a+" "+b);
                      return x.compareTo(y);
                  };
                 comparator.compare(a,b);
          
          }
        
    4. 有参数无返回值

注意

  • 参数列表一定和接口抽象方法一致列表一致
  • 参数列表在只有一个参数的时候可以省略括号、方法体只有一条语句时可以省略 ‘{}
  • 闭包内(即Lambda 表达式)的外部变量不能改变只能是 final 虽然没有显示定义 但是可以使 拷贝转移的方式更改
3 .四大内置函数式接口
  1. 消费型 Consumer

    •   Consumer<T>consumer
        	void accept(T t);
      
    • 接受参数 处理 不返回

  2. 供给型 Supplier

    •   Supplier<T> supplier
        	T get();
      
    • 不接受参数 根据逻辑提供返回值

  3. 函数型接口 Function

    •   Function<T, R>
        	R apply(T t);
      
    • 接受 两个 参数 类型为 T 返回;类型 为 R 经过内部逻辑

  4. 断言型 Predicate

    •   Predicate<T> predicate	boolean test(T t)
      
    • 接受参数 做出判断 返回Boolean 值

注意

  • 以上提到只是 四种内置的最基本的函数式子接口
  • 基于他们衍生非常多的函数式子接口 我们可以根据需要去选择
4.方法引用

​ 当 Lambda 方法体内部所执行的仅仅是对其他实现的引用**/** 方法体中的内容已经有方法去实现了 ,我们可以使用 方法引用 (一种特殊情况下的特定书写)

  1. 对象::实例方法名

    •   @Testpublic void lambdaTest4(){    PrintStream out = System.out;    Consumer<Integer> consumer= out::println;    consumer.accept(1000);}//括号直接省略
      
    • 实例

      •   public class MyPojo {    public boolean changeName(String name) {        name = "xhr";        System.out.println(name);        return true;    }}
        
    • 测试

      •   @Testpublic void lambdaTest5(){    MyPojo pojo=new MyPojo();    Predicate<String>predicate=pojo::changeName;    System.out.println(predicate.test("wbd"));}
        
  2. 类::静态方法名

    •   @Testpublic  void lambdaTest6(){    Supplier<Double> supplier=Math::random;    System.out.println(supplier.get());}
      
  3. 类::实例方法名

    • 特殊要求 (x,y)->{} 参数 1 必须为 参数 2 的调用者 而 参数 2 必须为 实例方法的参数

    •   @Testpublic void lambdaTest7() {    BiFunction<String, String, Boolean> biFunction =String::equals;    //Function 一类的衍生函数式接口    System.out.println(biFunction.apply("lxc", "xhr"));}
      
5 .构造器引用
  1. ​ ClassName::new

    1. 无参

      •   @Test
          public void lambdaTest8() {
              Supplier<MyPojo> supplier=MyPojo::new;
              MyPojo myPojo=supplier.get();
          }
        
    2. 有参构造

      1. 构造器

        1.  public MyPojo(int age, String name) {
               this.age = age;
               this.name = name;
           }
          
      2. 测试

        1.  @Test
           public void lambdaTest9() {
               BiFunction<Integer,String,MyPojo> biFunction=MyPojo::new;
               MyPojo myPojo=biFunction.apply(21,"lxc");
               System.out.println(myPojo.toString());
           }
          

      注意

      • 注意函数式接口的参数列表 类型数量 ,保持一致
  2. 构造数组

    1. Type::new

      •   @Test
          public void lambdaTest10() {
              Function<Integer,String[]>function=String[]::new;
              String[] apply = function.apply(10);
              System.out.println(apply.length);
              //构造数组时一定要给出数组长度
          }
        
### 回答1: Java 8引入了lambda表达式作为一种新的编程语言特性。lambda表达式是一种匿名函数,它可以作为参数传递给方法或存储在变量中。它可以简化代码,使代码更加易读和易维护。lambda表达式的语法非常简洁,可以用来替代匿名内部类。它可以在集合框架中使用,使代码更加简洁和易读。lambda表达式是Java 8中最重要的新特性之一,它使Java编程更加现代化和高效。 ### 回答2: Lambda 表达式是 Java 8 中最重要的新增特性之一,它可以让我们以更简洁的方式来编写代码,并且能够更优雅的解决许多问题。 Lambda 表达式本身是一个匿名函数,它可以被当做对象进行传递和处理。它强调的是函数式编程思想,将函数作为一等公民,并支持灵活的函数组合。Lambda 表达式通常由左侧的参数列表、箭头符号和右侧的函数体组成。例如: ``` (x, y) -> x + y ``` 上述代码定义了一个 lambda 表达式,这个表达式接受两个参数 x 和 y,然后返回它们的和。 Lambda 表达式的用途非常广泛,它们通常用于简化代码,比如用于普通的遍历集合和数组: ``` List<String> names = Arrays.asList("alice", "bob", "charlie"); names.forEach(name -> System.out.println(name)); ``` Lambda 表达式还可以用于函数式接口,这是一种只包含一个抽象方法的接口。函数式接口可以被当做 lambda 表达式的类型,这意味着我们可以使用 lambda 表达式来创建这种类型的对象。例如: ``` interface Calculator { int calculate(int a, int b); } Calculator add = (a, b) -> a + b; Calculator sub = (a, b) -> a - b; ``` 上述代码定义了一个接口类型 Calculator,它包含一个抽象方法 calculate,并且使用 lambda 表达式来定义 add 和 sub 两个对象,它们分别代表加法和减法。 Lambda 表达式还支持方法引用,这是一种更简洁的语法形式,它允许我们使用方法名来代替 lambda 表达式的函数体。例如: ``` List<String> names = Arrays.asList("alice", "bob", "charlie"); names.forEach(System.out::println); ``` 上述代码使用了方法引用,它代替了之前的 lambda 表达式。 总之,Java 8Lambda 表达式是一项非常有用的功能,它提供了一种更简单的方式来编写代码,让我们的代码更加简约且易于阅读。同时,它也是一种函数式编程思想的体现,让 Java 开发者能够更好的应用这些思想来解决实际问题。 ### 回答3: Java8lambda表达式是一个Java编程语言的新特性,它可以方便地为函数式接口创建实例。Lambda表达式允许你直接以更加简单和精简的方式来定义内部类,并且能够省略掉那些没有用的代码。 在Java 8中,Lambda表达式通过一个箭头“->”来定义。在箭头左边是参数列表,这些参数可以是任何类型,但是Lambda表达式中只能有一个方法参数。在箭头右边是Lambda表达式的主体,也就是这个Lambda表达式所要执行的代码块。 Lambda表达式还可以访问外部作用域中的变量,这是通过捕获变量的方式来实现的。Lambda表达式在使用外部变量时会将其捕获到Lambda表达式内部,从而形成一个闭包,这使得Lambda表达式能够访问外部的变量。 Lambda表达式的使用能够使得代码更加简洁,能够将代码逻辑更加清晰地表达。在Java8中,Lambda表达式被广泛应用于集合的处理,比如通过对集合进行排序、过滤、映射等操作,能够更加简单地处理数据集合。Lambda表达式还被应用于多线程的编程中,能够使得并发编程更加方便和简单。 总之,Java 8Lambda表达式是一个很有用的新特性。它能够使得Java代码更加简洁和易于理解,减少了冗余的结构和语法。同时,它也提供了更加灵活的编程方式,使得Java编程能够更加高效和便利。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值