lambda表达式传参

Posted shuhe-nd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambda表达式传参相关的知识,希望对你有一定的参考价值。

Lambda表达式中使用的变量需要遵循以下规则:

 

1、只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
2、局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
3、不允许声明一个与局部变量同名的参数或者局部变量。
下面这段代码编译器会报错:

public static void main(String args[])
    List<String> dest = new ArrayList<>();
    List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03"));
    src.forEach(item -> 
        add(dest,item);
    );
    dest = null;

因为违反了第二条规则(局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义))

稍作修改,去掉对dest的修改,可以编译通过:

public static void main(String args[])
    List<String> dest = new ArrayList<>();
    List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03"));
    src.forEach(item -> 
        add(dest,item);
    );

通过lambda表达式,向线程中传递局部变量,并且执行相关操作:

    public static void main(String args[])
        List<String> dest = new ArrayList<>();
        List<String> src = new ArrayList<>(Arrays.asList("01", "02", "03"));
        new Thread(()->add(dest,"a")).start();
        try 
            Thread.sleep(1000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
        System.out.println(dest.size());

    

    private static void add(List<String>l,String item)
        l.add(item);
        System.out.println(item);
    

 

以上是关于lambda表达式传参的主要内容,如果未能解决你的问题,请参考以下文章

匿名函数

chapter4.5匿名函数

第十二天python3 匿名函数

C#学习(10):委托

内置函数及匿名函数 补充

Lambda表达式中的表达式lambda和语句lambda区别