Java:lambda表达式

本文详细介绍了Java8中引入的lambda表达式,包括其简洁的语法、与函数式接口的关系,以及在集合操作、并发编程和GUI事件处理中的应用。同时讨论了其优点和使用时的注意事项。
摘要由CSDN通过智能技术生成

Java中的lambda表达式是Java 8引入的一个重要特性,它提供了一种简洁、灵活的方式来表示匿名函数。Lambda表达式可以用来表示接口的一个实现,而这个接口必须只有一个抽象方法,这样的接口被称为函数式接口(Functional Interface)。

Lambda表达式的语法

Lambda表达式的一般语法为:

(parameters) -> expression

或者

(parameters) -> { statements; }
  • parameters:参数列表,可以省略参数的类型,如果只有一个参数且其类型可推导,甚至可以省略括号。
  • ->:lambda操作符,用来分隔参数列表和lambda体。
  • expression:当lambda表达式有一个表达式时,直接写表达式即可,该表达式的结果就是lambda表达式的结果。
  • statements:当lambda表达式包含多个语句时,需要用花括号括起来,类似于方法体。

示例

// 无参数的lambda表达式
Runnable r = () -> System.out.println("Hello World");

// 带有一个参数的lambda表达式
Consumer<String> c = (s) -> System.out.println(s);

// 等价于上面的lambda表达式,参数类型可推导,省略括号
Consumer<String> c = s -> System.out.println(s);

// 带有两个参数的lambda表达式,并包含多个语句
BiFunction<Integer, Integer, Integer> adder = (a, b) -> {
    int sum = a + b;
    return sum;
};

函数式接口

Lambda表达式通常与函数式接口一起使用。函数式接口是定义在java.util.function包中的接口,它们代表了一种行为,可以被用作lambda表达式的类型。

例如,Runnable是一个函数式接口,它有一个抽象方法run(),可以这样使用lambda表达式:

new Thread(() -> System.out.println("Hello from lambda")).start();

使用场景

Lambda表达式可以用在任何需要函数式接口的地方,例如:

  • 集合的操作,如forEach方法。
  • 并发编程,如ExecutorServiceexecute方法。
  • GUI事件处理,如按钮点击事件。
  • 流(Stream)API的操作,如mapfiltersorted等。

优点

  • 代码简洁:Lambda表达式使得代码更加简洁,减少了模板代码。
  • 提高可读性:清晰的表达了意图,使得代码更易于理解。
  • 灵活性:可以作为参数传递给方法,使得代码更加灵活。

注意事项

  • Lambda表达式不适用于所有场景,有时候匿名内部类能提供更多的功能。
  • 当Lambda表达式中访问外部局部变量时,变量必须是final的,或者实际上没有被后续代码修改,即effectively final。
  • 在高并发场景下,需要注意线程安全问题。

Lambda表达式是现代Java编程中不可或缺的一部分,它提供了一种强大的方式来处理函数式编程的概念,使得代码更加简洁和灵活。


示例一
package lambda;

/*
推导lambda表达式
*/
public class TestLambda {

   //3、静态内部类
   static class Like2 implements Ilike{
       @Override
       public void lambda() {
           System.out.println(" I like lambda2 !");
       }
   }

   public static void main(String[] args) {
       Ilike like=new Like();
       like.lambda();

       Ilike ilike2=new Like2();
       ilike2.lambda();


       //4、局部内部类
        class Like3 implements Ilike{
           @Override
           public void lambda() {
               System.out.println(" I like lambda3 !");
           }
       }

        Ilike like3=new Like3();
        like3.lambda();

        //5、匿名内部类
       like= new Ilike(){
           @Override
       public void lambda(){
               System.out.println("I like lambda4 !");
           }
       };
       like.lambda();

       //6、用lambda简化
       like=()->{
           System.out.println("I like lambda5 !");
       };
       like.lambda();


   }
}

//1、定义一个函数式接口
interface Ilike{
   void lambda();
}

//2、实现类
class Like implements Ilike{
   @Override
   public void lambda() {
       System.out.println(" I like lambda !");
   }
}
运行结果

在这里插入图片描述

示例一代码简化
package lambda;

public class TestLambda2 {


  public static void main(String[] args) {

      //1、lambda表示简化
      Ilove love=(int a)->{
          System.out.println("I love you!**"+a);
      };

      //简化1: 参数类型
       love=( a)->{
          System.out.println("I love you!**"+a);
      };

       //简化2:简化括号
      love =a -> System.out.println("I love you!**"+a);


      //简化3:去掉花括号
      love =a -> {
          System.out.println("I love you!**"+a);
      };

      love.love(520);

      /*
      总结:
          lambda表达式只能用一行代码的情况下,才能简化为一行,如果有多行,那么就用代码块包裹。
          前提是函数式接口
          多个参数也可以去掉参数类型,要去掉就都去掉,必须加上括号
       */
  }
}

interface Ilove{
  void love(int a);
}



运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值