首页 > 编程语言 >Java笔记:Lambda表达式

Java笔记:Lambda表达式

时间:2024-03-03 16:11:06浏览次数:24  
标签:Java int addOperation 接口 operate 表达式 Lambda

Lambda表达式在Java中是函数式编程的一种体现,允许把函数作为一个方法的参数传递进方法中,或者将函数作为方法的返回值。

1. 语法和基础使用

语法:

// Lambda实现是一个简单的表达式
(parameters) -> expression;
// Lambda实现是一个函数体
(parameters) -> {statements;}
  • parameters是参数列表,如果没有参数,则需要使用一个空括号 () -> ...
  • 如果只有一个参数,则可以不用括号 parameter -> ... (推荐),也可以使用括号 (parameter) -> ...
  • 如果有多个参数,则正常使用参数列表即可 (parameter1, parameter2, ...) -> ...
  • 由于java中对于Lambda表达式的类型推断机制,其中的parameter可以声明参数类型,也可以不用,如 (int parameter) -> ...

示例1:只有一个参数,函数主体是简单表达式。

List<String> names = Arrays.asList("zhangsan", "lisi", "wangwu");
// 单参数 + 简单表达式,也是将Lambda表达式作为函数传递给方法
names.forEach(name -> System.out.println(name));

示例2:使用Lambda表达式实现函数式接口,并作为参数传入方法。

public class Main {
    public static void main(String[] args) {
        // 使用Lambda表达式实现接口
        AddOperation addOperation = (a, b) -> System.out.println(a + b);
        // 执行对应的接口方法
        addOperation.operate(1, 2);
        // 将Lambda表达式作为参数传入方法
        Main.add_operate(3, 4, addOperation);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a, int b);
    }

    /**
     * 将接口作为参数类型
     */
    public static void add_operate(int a, int b, AddOperation addOperation) {
        addOperation.operate(a, b);
    }
}

函数式接口: 能用Lambda表达式实现的接口必须是函数式接口,即内部只有一个抽象方法的接口。可以使用注解@FunctionalInterface来标识该接口,如果该接口不满足函数式接口的定义则会报错,例如接口中有两个抽象方法。

2. 变量作用域

Lambda表达式中使用的局部变量,是隐式的final类型,即不可以在表达式后再修改该变量的值。以下示例会报编译错误:

public class Main {
    public static void main(String[] args) {
        int b = 1;
        // b为隐式的final类型,不允许在Lambda后面再修改b的值
        // 此处IDE会提示:variable used in lambda expression should be final or effectively final
        AddOperation addOperation = a -> System.out.println(a + b);
        b = 3;
        addOperation.operate(2);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a);
    }
}

Lambda表达式中的参数定义也不能和局部变量的参数名称同名,以下示例会报编译错误:

public class Main {
    public static void main(String[] args) {
        int b = 1;
        int c = 2;
        // 此处Lambda表示的参数b和局部变量的名称相同,编译会报错
        // IDE也会提示:Variable 'b' is already defined in the scope
        AddOperation addOperation = b -> System.out.println(b + c);
        addOperation.operate(2);
    }

    /**
     * 定义一个接口
     */
    interface AddOperation {
        void operate(int a);
    }
}

标签:Java,int,addOperation,接口,operate,表达式,Lambda
From: https://www.cnblogs.com/guyuyun/p/18033409

相关文章

  • java - 流式编程
    1.获取流的方法://1.从集合转化List<Integer>list=newArrayList<>();Stream<Integer>stream=list.stream();//转化为流stream.Collect(Collectors.toList());//转换为流,流再转回为集合。//2.自定义初始化Stream<Integer>stream=Stream.of(1,5,6,4,8,3,1,9); 2......
  • Java数组
    Java数组一、什么是数组数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。【数组下标从0开始】二、数组声明创建首先必须声明数组变量,才能在程......
  • Java学习笔记——第四天
    数组数组是什么数组就是一个容器,用来存一批同种类型的数据。数组有什么用遇到批量数据的存储和操作时,数组比变量更适合。代码简洁,逻辑清晰。数组的定义静态初始化数组定义数组的时候直接给数组赋值。格式1(完整格式)数据类型[]数组名=new数据类型[]{元素1,元素2,元素3…......
  • 代码随想录 第11天 | 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150.
    Leetcode:20.有效的括号-力扣(LeetCode)思路:就是用栈存左右括号,都为0就说明true,不为零说明有没有匹配成功的括号,是false,思路没有问题,时间超时了,还得用C++...,java更好的思路如下:如果是左括号,push右括号,如果是右括号,判断是否与栈顶元素匹配,JAVA//deque.isEmpty();这个方法返回......
  • Java中类与类、类与接口、接口与接口之间是什么关系?
    Java中类与类之间是什么关系?1.依赖依赖是指一个类(称为依赖类)使用到了另一个类(称为被依赖类),而这种使用关系是具有偶然性的、临时性的、非常弱的,但是被依赖类(目标类)的变化会影响到依赖类。例如,比如人A要过河,需要借用一条船B,此时人A与船B之间的关系就是依赖。表现在代码层面,为类B......
  • Java方法
    何为方法Java方法是语句的集合,它们在一起执行一个功能,方法包含于类或对象中,方法在程序中被创建,在其他地方被引用设计方法的原则:保持方法的原子性-一个方法只完成1个功能,这样利于后期的拓展publicclassDemo01{publicstaticvoidmain(String[]args){ints......
  • 「java.util.concurrent并发包」之 Unsafe
    一unsafe介绍Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C......
  • 是学习c++还是java?
    上高中时,自己第一次接触到学校的中华学习机和苹果机,当时中华学习机上可以进行basic编程,那时候自己其实就爱上编程,但是没有人指点,也学习不得法,所以就没有进行下去!大学时,自己的主攻专业并不是计算机,但是学习了《计算机基础》和《c程序设计》,前者主要学习dos命令和wps文字处理,后者主......
  • Java方法
    JAVA方法一、什么是方法?System.out.println(),他们是什么?System.out.println();/*System是一个类out是System下的一个输出对象println()就是一个方法*/Java方法是语句的集合,它们在一起执行一个功能,方法是解决一类问题的步骤的有序组合方法包含于类或对象中方法在......
  • Java引用类型解析:掌握强引用、软引用、弱引用和幻象引用的妙用
     概述:Java中的引用分为强引用、软引用、弱引用和幻象引用。强引用是最常见的,不会被垃圾回收;软引用在内存不足时才被回收;弱引用在下一次垃圾回收时回收;幻象引用用于检测对象是否已被回收。它们各自适用于不同场景,帮助开发者更灵活地管理对象生命周期,避免内存泄漏。在Java中,引......