别翻了,Lambda 表达式入门,看这篇就够了(2)

简介: 别翻了,Lambda 表达式入门,看这篇就够了

下面我们来详细地一一介绍下。


01)把 limit 变量声明为 static


要想把 limit 变量声明为 static,就必须将 limit 变量放在 main() 方法外部,因为 main() 方法本身是 static 的。完整的代码示例如下所示。


public class ModifyVariable2StaticInsideLambda {
    static int limit = 10;
    public static void main(String[] args) {
        Runnable r = () -> {
            limit = 5;
            for (int i = 0; i < limit; i++) {
                System.out.println(i);
            }
        };
        new Thread(r).start();
    }
}


来看一下程序输出的结果:


0

1

2

3

4

1

2

3

4

5

OK,该方案是可行的。


02)把 limit 变量声明为 AtomicInteger


AtomicInteger 可以确保 int 值的修改是原子性的,可以使用 set() 方法设置一个新的 int 值,get() 方法获取当前的 int 值。


public class ModifyVariable2AtomicInsideLambda {

   public static void main(String[] args) {

       final AtomicInteger limit = new AtomicInteger(10);

       Runnable r = () -> {

           limit.set(5);

           for (int i = 0; i < limit.get(); i++) {

               System.out.println(i);

           }

       };

       new Thread(r).start();

   }

}


来看一下程序输出的结果:


0

1

2

3

4

1

2

3

4

5

OK,该方案也是可行的。


03)使用数组


使用数组的方式略带一些欺骗的性质,在声明数组的时候设置为 final,但更改 int 的值时却修改的是数组的一个元素。


public class ModifyVariable2ArrayInsideLambda {
    public static void main(String[] args) {
        final int [] limits = {10};
        Runnable r = () -> {
            limits[0] = 5;
            for (int i = 0; i < limits[0]; i++) {
                System.out.println(i);
            }
        };
        new Thread(r).start();
    }
}


来看一下程序输出的结果:


0

1

2

3

4

1

2

3

4

5

OK,该方案也是可行的。


03、Lambda 和 this 关键字


Lambda 表达式并不会引入新的作用域,这一点和匿名内部类是不同的。也就是说,Lambda 表达式主体内使用的 this 关键字和其所在的类实例相同。


来看下面这个示例。


public class LamadaTest {
    public static void main(String[] args) {
        new LamadaTest().work();
    }
    public void work() {
        System.out.printf("this = %s%n", this);
        Runnable r = new Runnable()
        {
            @Override
            public void run()
            {
                System.out.printf("this = %s%n", this);
            }
        };
        new Thread(r).start();
        new Thread(() -> System.out.printf("this = %s%n", this)).start();
    }
}



Tips:%s 代表当前位置输出字符串,%n 代表换行符,也可以使用 \n 代替,但 %n 是跨平台的。


work() 方法中的代码可以分为 3 个部分:


1)单独的 this 关键字


System.out.printf("this = %s%n", this);


其中 this 为 main() 方法中通过 new 关键字创建的 LamadaTest 对象——new LamadaTest()。


2)匿名内部类中的 this 关键字


Runnable r = new Runnable()
{
    @Override
    public void run()
    {
        System.out.printf("this = %s%n", this);
    }
};



其中 this 为 work() 方法中通过 new 关键字创建的 Runnable 对象——new Runnable(){...}。


3)Lambda 表达式中的 this 关键字


其中 this 关键字和 1)中的相同。


我们来看一下程序的输出结果:


this = com.cmower.java_demo.journal.LamadaTest@3feba861

this = com.cmower.java_demo.journal.LamadaTest$1@64f033cb

this = com.cmower.java_demo.journal.LamadaTest@3feba861


符合我们分析的预期。




04、最后


尽管 Lambda 表达式在简化 Java 编程方面做了很多令人惊讶的努力,但在某些情况下,不当的使用仍然会导致不必要的混乱,大家伙慎用。


好了,我亲爱的读者朋友们,以上就是本文的全部内容了。能在疫情期间坚持看技术文,二哥必须要伸出大拇指为你点个赞👍。原创不易,如果觉得有点用的话,请不要吝啬你手中点赞的权力——因为这将是我写作的最强动力。


相关文章
|
4天前
|
Python
python函数进阶
python函数进阶
|
17天前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
5月前
|
C++
【C/C++ 编程 入门篇】 if条件判断表达式的使用教程
https://developer.aliyun.com/article/1465430
77 0
|
5月前
|
Java
Lambda 表达式复习
Lambda 表达式复习
28 1
|
5月前
|
机器学习/深度学习 开发框架 .NET
C# 中的 Lambda 表达式:一种简洁而强大的编程工具
【1月更文挑战第6天】在现代编程中,Lambda 表达式已经成为一种非常流行的编程范式。C# 作为一种功能强大的、面向对象的编程语言,自然也不例外。Lambda 表达式在 C# 中提供了一种简洁、灵活的方式来表示匿名函数。这些函数可以被用作委托或表达式树类型,从而在各种不同的上下文中使用。
Python知识点:lambda 表达式
lambda 表达可以被看做是一种匿名函数。它可以让你快速定义一个极度简单的单行函数。譬如这样一个实现三个数相加的函数:
|
编译器 C++
【c ++ primer 笔记】第4章 表达式
**运算对象转换** - `小整数类型(如bool、char、short等)通常会被提升成较大的整数类型,主要是 int 型` - 一般在进行二元运算符时,即使俩个数类型不一样,只要他们可以相互准换为同一个类型就可以。 - 运算符作用于类类型的运算对象时,用户可以自行定义其含义。这种做法称之为`重载运算符`
114 0
|
JavaScript 前端开发 Java
别翻了,Lambda 表达式入门,看这篇就够了(1)
别翻了,Lambda 表达式入门,看这篇就够了
151 0
别翻了,Lambda 表达式入门,看这篇就够了(1)
|
Java 编译器
深入理解Java Lambda 表达式
Java 8 的 Lambda 表达式已经不再是“新特性”。 现在很多人工作中会使用 Lambda 表达式。 但是,你是否真正理解 Lambda 表达式的底层原理?
270 0
深入理解Java  Lambda 表达式