精华内容
下载资源
问答
  • lambda表达式一般写成fliter(e -> e ==0)这种。但是如果filter中的lambda非常长而且用的比较多,最好就要抽取出来做成变量了。但是之前没这么用过,还是研究了一番。 记录一下供以后查阅。 代码 不同的算子...

    前言

    论lambda,除了Python的,属Java最恶心了,写起来比Scala和js都难受,但是毕竟聊胜于无嘛。

    lambda表达式一般写成fliter(e -> e == 0)这种。但是如果filter中的lambda非常长而且用的比较多,最好就要抽取出来做成变量了。但是之前没这么用过,还是研究了一番。

    记录一下供以后查阅。

     

    代码

    不同的算子需要传入参数的类型也不同,下面定义的三个方法分别是filter、map、sort三个算子使用的。

    public class Lambda {
        //过滤不合法经纬度
        public static Predicate<JSONObject> filterIllegalCoordinate = event ->
                event.getString("longitude") != null
                        && event.getString("latitude") != null);
    
        //修正经纬弄反的数据
        public static Function<JSONObject, JSONObject> reviseCoordinate = event -> {
            Double longitude = Double.parseDouble(event.getString("longitude"));
            Double latitude = Double.parseDouble(event.getString("latitude"));
            if (longitude < latitude) {
                event.put("longitude", latitude);
                event.put("latitude", longitude);
            }
            return event;
        };
    
        //排序
        public static Comparator<JSONObject> sortTowerId = (o1, o2) -> {
            return o1.getInteger("realId") - o2.getInteger("realId");
        };
    }

    主代码中调用上述lambda变量。

    List<JSONObject> mockData = data.stream()
                    .map(StringUtil::splitTowerIdAndDirection)
                    .filter(Objects::nonNull)
                    .filter(Lambda.filterIllegalCoordinate)
                    .map(Lambda.reviseCoordinate)
                    .sorted(Lambda.sortTowerId);

     

    结束。

     

    展开全文
  • 1)lambda表达式等价于一个小函数,...3)在lambda表达式中使用没有定义的变量,默认是全局变量。 这里就进行演示一下为什么lambda上面的定义: # -*- coding: utf-8 -*- # @Time : 2018/12/4 17:41 # @Author...
    1)lambda表达式等价于一个小函数,表达式的值就是函数的返回值。 
    2)可以给lambda表达式起名字,也可以不起名字。
    3)在lambda表达式中使用没有定义的变量,默认是全局变量。

     

    这里就进行演示一下为什么lambda上面的定义:

    # -*- coding: utf-8 -*-
    # @Time    : 2018/12/4 17:41
    # @Author  : lh
    # @Email   : 22@qq.com
    # @File    : lambda_test.py
    # @Software: PyCharm
    
    
    
    
    r = []
    for x in range(10):
        r.append(lambda: x**2)
    
    print(r[0](), r[2](), r[5](), r[6](), r[9]())

    你会发现wu无论是r[0](),还是 r[2](), r[5](), 还是r[6](), r[9]()输出都是:81 81 81 81 81

    因为在lambda表达式中使用没有定义的变量,默认是全局变量。

    所以如果你想正常输出0-9的平方的结果还是要在lambda中定义一个变量,这样才是一个局部变量。

    这是示例:

    r = []
    for i in range(10):
        # 定义一个lambda表达式
        r.append(lambda n=i: n**2)
    print(r[0](), r[1](),r[2]())

    这样输出结果才不会是都是一样的。

    转载于:https://www.cnblogs.com/Apy-0816/p/11100271.html

    展开全文
  • lambda表达式访问变量和方法

    千次阅读 2017-03-01 13:22:31
    一、lambda表达式(lambda块)中访问变量和方法 1、lambda表达式可以其访问外层作用域定义的局部变量。但是lambda表达式不能修改外层局部变量的值。如: public static void main(String[] args) { double ...
    一、lambda表达式(lambda块)中访问变量和方法
    1、lambda表达式可以其访问外层作用域定义的局部变量。但是lambda表达式不能修改外层局部变量的值。如:
    public static void main(String[] args) {
    double var = 100; // 外层局部变量
    DemoFunc df = (n) -> {
    double res = var + n;
    // var= 200; 报错
    // var++; 报错
    return res;
    };
    df.func(3.14);
    }
    其中,var 是 lambda块的外层作用域中的变量,而且是经初始化的局部变量。在lambda表达式中可以访问它,但是不能修改它的值。相当于lambda表达式将外层局部变量当做 final常量来使用。可见,未初始化的外层局部变量不能被lambda表达式访问,也不能在lambda块内对其初始化

    2、lambda表达式可以获取或者更改其外层类的属性
    lambda表达式(lambda块)内可以通过this关键字(或不使用)访问或修改类的属性。
    public class Lambda6 {
    int age;
    public double method(){
    DemoFunc df = (n) -> {
    this.age = 23;
    this.age = 51; //可以多次修改
    return age;
    };
    return df.func(1.2);
    }
    }
    如果外层类的属性是 final 标识的,则lambda内只能访问,不可以修改。
    如果外层类的属性是 static 标识的,同样可以访问和多次修改。
    public class Lambda6 {
    static int age = 10;
    public double method(){
    DemoFunc df = (n) -> {
    Lambda6.age = 23;
    Lambda6.age = 45; //多次修改
    return age;
    };
    return df.func(1.2);
    }
    }

    3、外层类的属性是某个类的对象引用,lambda表达式可以通过该引用访问或修改类的变量。
    class Test{
    int a ;
    }
    public class Lambda6 {
    Test t;
    public double method(){
    DemoFunc df = (n) -> {
    t.a = 100;
    return t.a;
    };
    return df.func(1.2);
    }
    }
    展开全文
  • lambda表达式变量作用域

    千次阅读 2015-12-09 09:56:41
    写给大忙人看的JavaSE8中的lambda表达式变量作用域

    如下代码中的变量count和text,没有在lambda表达式中被定义,而是repeatMessage方法的参数变量

        public void repeatMessage(String text, int count){
            Runnable r = () -> {
                for (int i=0; i<count; i++){
                    System.out.println(text);
                    Thread.yield();
                }
            };
            new Thread(r).start();
        }

    一个lambda表达式包括三部分:

    1.一段代码。

    2.参数。

    3.只有变量的值。(“自由”指的是那些不是参数并且没有在代码中定义的变量)


    在lambda表达式中,被引用的变量的值不可以被更改,如下代码:

        public void repeatMessage(String text, int count){
            Runnable r = () -> {
                while (count > 0){
                    count --; //错误,不能更改
                    System.out.println(text);
                    Thread.yield();
                };
            };
            new Thread(r).start();
        }
    原因:更改lambda表达式中的变量不是线程安全的,自增、自减操作不是原子性的。


    内部类也会捕获闭合作用域中的值。在Java8前,内部类只允许访问final的局部变量。为了适应lambda表达式,这条规则现在放宽了。一个内部类可以访问任何有效的final局部变量,即任何值不会发生变化的变量。


    在lambda表达式中不允许声明一个与局部变量同名的参数或者局部变量,如下代码:

    Path first = Paths.get("/usr/bin");
            Comparator<String> comparator =
                    (first, second) -> Integer.compare(first.length(), second.length());
            //错误:变量first已经被定义了

    lambda表达式中的this关键字的意义,如下代码:

    class Application {
        public void doWork(){
            Runnable runner = () -> {
                System.out.println(this.toString());
            };
        }
    }
    this.toString()会调用Application对象的toString方法,而不是Runnable实例的toString方法

    展开全文
  • 假定没有要求lambda表达式外部变量为final修饰,那么开发者会误以为外部变量的值能够在lambda表达式中被改变,而这实际是不可能的,所以要求外部变量为final是在编译期以强制手段确保用户不会在lambda表达式中做修改...
  • 零点起飞学C#之Lambda表达式和查询...下面说明了为何这条 规则和外延性是等价的: 若f与g外延地等价,即:f a == ga对所有的lambda表达式a成立,则当取a为 在f 中不是自由出现的变量x时,我们有f......(54)发明名称 使用...
  • # lambda表达式 def filter_lt(predidcate,lt): result=[] for elem in lt: if predidcate(elem): result.append(elem) return result lt=['Justin','caterpillar','openhome...
  • Lambda表达式中引用变量的问题

    千次阅读 2020-03-23 13:55:15
    Lambda表达式中引用变量的问题 Lambda表达式内部自定义的变量肯定没问题。引用的外部final变量也没问题。问题在于effectively final变量的理解,及应用场景的认识。引用的外部变量没有加final限定符,只要没有发生过...
  • lambda表达式

    2018-12-31 12:31:56
    目录1. 什么是lambda表达式2. lambda表达式语法2.1 lambda表达式的一般语法2.2 lambda表达式的... lambda表达式可使用的变量4. lambda表达式中的this概念5. 函数式接口6.方法引用7. 构造器引用 1. 什么是lambda表达...
  • 使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识。 day042 lambda表达式(构造器引用、变量作用域、处理lambda表达式、再谈Comparator) ...
  • Java 8中的Lambda表达式Lambda表达式变量作用域使用示例注意点 Lambda表达式 Lambda中允许将一个函数作为方法的参数,即函数作为参数传递进方法中 使用Lambda表达式可以使代码更加简洁 变量作用域 Lambda表达式...
  • lambda表达式在使用局部变量的问题 在使用lambda表达式的时候,经常会遇到一个问题,那就是在lambda表达式内部修改局部变量的的值时候,编译器会报错,说变量类型必须为final才可以使用,也就是说不让我们修改,这...
  • q点击“蓝字”关注我吧总述C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的...利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,...
  • 先看下Lambda表达式里面修改外部变量问题 因为平台用的是JDK8,而且发现自己对那些新特性好像一点都不了解,就例如Lambda表达式,所以就开始对自己的代码进行改进了。。。  例如遍历Map,像我们正常遍历肯定是下面...
  • c++ lambda表达式捕获变量参数

    千次阅读 2015-12-07 14:16:12
    []不捕获任何变量 [&]捕获外部作用域中所有变量,并作为引用在函数体重使用 [=]捕获外部作用域中所有变量...[this]捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=
  • 这个字母最早是Church开始使用的,不过Church也是受一本书《权威数学》的^表示自由自由变量启发,然后自己改用希腊字母λ来表示,渐渐地,带有参数的表达式就被称为lambda表达式。好,知道了咋来的我们来看...
  • lambda表达式修改外部变量

    千次阅读 2020-01-14 15:23:41
    lambda 表达式接受外部变量是通过copy副本的方式,所以编译器要求不能修改该变量值或则引用值,如果要修改可以通过集合或则实体类包装的方式实现。 如: https://zhuanlan.zhihu.com/p/29245059 public static void ...
  • Lambda 表达式的作用域 1.访问局部变量 2.访问对象字段与静态变量 3.不能访问接口的默认方法 4.Lambda表达式中的this 5.综合理解Lambda表达式的作用域 …………
  • ①有1个变量时: >>> lambda x : x if x % 2 else None ②有2个变量时: >>> f = lambda x,y = 3 : x * y >>> f(3) >>> 9 >>> f(4,6) >>> 24 >>>...
  • lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final…
  • 通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: packagejava8test; publicclassT1{ publicstaticvoidmain(String[]args){ repeatMessage("Hello",20); } publicst...
  • lambda表达式可以使用来自它们的环境变量吗? 是的。这就是所谓的变量捕获。实例和静态变量可以不受限制地在lambda的主体被使用和改变。尽管如此,使用局部变量有更多的限制:局部变量不允许捕获除非他们确定是...
  • Lambda表达式

    2020-09-20 14:54:40
    Lambda表达式 1.Lambda表达式介绍 通常的,我们将字符串,字符,数值赋值给变量,从而进行一系列的计算和操作,那么,有没有想过将一整串代码赋值给变量呢?答案是可行的,Java 8中新出现的特性Lambda表达式填补了这...
  • Lambda表达式下访问外部变量

    千次阅读 2020-02-19 22:59:30
    Lambda表达式可以访问给它传递的变量,访问自己内部定义的变量,同时也能访问它外部的变量。 不过lambda表达式访问外部变量有一个非常重要的限制: 变量不可变(只是引用不可变,而不是真正的不可变) 遇到问题: 有...
  • 总述 C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). 它是定义和使用匿名函数对象的一种简便的方式。匿名函数是我们需要用到的一个函数,但是又不想去费力命名一个函数的场景。我们无需为每个值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,985
精华内容 1,194
关键字:

lambda表达式变量