精华内容
下载资源
问答
  • lambda 修改集合中字符串的内容 List listStr = new ArrayList(); list.add(“cat”); list.add(“dog”); list.add(“monkey”); List list4 = new ArrayList(); list4 = list.stream().map(item->item = item +...

    lambda 修改集合中字符串的内容

    List<String> listStr = new ArrayList<String>();
    listStr.add("cat");
    listStr.add("dog");
    listStr.add("monkey");
    List<String> newListStr= new ArrayList<String>();
    newListStr= listStr.stream().map(item->item = item + "abc").collect(Collectors.toList());
    
    

    Mark

    展开全文
  • c# list 通过lambda修改某个字段的值

    千次阅读 2019-03-14 15:05:53
    //lambda 表达式修改 into.ForEach(i=&gt; { if(i.name="xxx") { i.name="xxx";//新的值 } } ) public class s { public string name{get;set;} public string age...

    list<s>  info = new list<s>();

    //lambda 表达式修改

    into.ForEach(i=>

    {

    if(i.name="xxx")

    {

    i.name="xxx";//新的值

    }

    }

    )

    public class s

    {

    public string name{get;set;}

    public string age{get;set;}

    }

    展开全文
  • lambda表达式一般能修改外部变量,可以通过把变量加入集合或则封装实体中,来修改内部元素的方式来修改对应的变量数据: 如: public static void main(String[] args) { System.out.println("sss"); List<...

    lambda表达式一般不能修改外部变量,可以通过把变量加入集合或则封装实体中,来修改内部元素的方式来修改对应的变量数据:
    如:

    public static void main(String[] args) {
    
            System.out.println("sss");
    
            List<String> list = Arrays.asList("0.1", "1.22", "22", "321");
            List<BigDecimal> bigDecimal = new ArrayList<>();
    
            list.forEach(u->{
                if (CollectionUtils.isEmpty(bigDecimal)) {
                    bigDecimal.add(new BigDecimal(u));
                } else {
                    bigDecimal.set(0, bigDecimal.get(0).add(new BigDecimal(u)));
                }
    
    
            });
    
            System.out.println(bigDecimal.toString());
    
    
    
        }
    
    展开全文
  • 内部类值无法修改原因问题描述原因分析原理分析内部类外面的局部变量能被重复赋值否则会报错在内部类里面能修改局部类外面定义的变量的值 问题描述 当使用内部类时 内部类外面的局部变量能被重复赋值否则会...

    问题描述

    当使用内部类时
    内部类外面的局部变量不能被重复赋值否则会报错 为什么?
    在内部类里面不能修改局部类外面定义的变量的值 为什么?
    内部类使用局部变量报错图片

    原因分析

    想知道上面的原因需要知道编译器是怎么编译内部类的

    原理

    • 内部类对象创建规则

      • lambda内部类
        根据javap -p反编译可以发现会生成方法 private static void lambda$test$0(int);
        运行时会生成字节码创建对象
      • 匿名内部类
        编译器扫描到一个内部类时会在该类同包下创建一个class字节码文件
    • 命名规则

      • lambda内部类
        外部类名称lambda/ com.nailsoul.config.RedisConfiglambda内部类自增序号/随机值 如com.nailsoul.config.RedisConfigLambda$1/1535128843
      • 普通内部类
        外部类名称$普通内部类自增序号/随机值 如com.nailsoul.config.RedisConfig$1

        通过下面代码来检查上面理论

        public void test(){
        int count = 1;
        Runnable l1 = ()->{ int t = count; };
        Runnable l2 = ()->{};
        Runnable r1 = new Runnable() {@Override public void run() { }};
           System.out.println(l1.getClass().getName()+"\n"+l2.getClass().getName()+"\n"+r1.getClass().getName());
        }
        

        结果

        com.nailsoul.config.RedisConfig$$Lambda$1/1535128843
        com.nailsoul.config.RedisConfig$$Lambda$2/1586270964
        com.nailsoul.config.RedisConfig$1
        
    • 内部类final字段创建

      • 会为普通内部类创建一个类型为外部类的final成员变量并为它赋值

        • lambda内部类只有访问了外部类的成员属性或成员方法时才会创建 并且为私有的
        • 普通内部类不管有没有访问直接创建 为包访问
      • 会为这个内部类访问的所有外部局部变量创建一个同类型的私有final成员变量并为它们赋值

        • 成员变量与成员方法通过外部类对象来访问 只会创建外部类对象final字段

      可以通过反射来检查上面的理论

      static int k1 = 2;
      int v1 = 3;
      public void test(){
          int tt = 1; String xx="few";
          Runnable r = new Runnable() {@Override public void run() {}};
          Runnable lr = ()->{ String s = tt + xx + k1; }; //访问了类变量
          Runnable lr2 = ()->{ String s = tt + xx + v1; }; //访问类成员变量
          printFields(r,"//r"); printFields(lr,"//lr");printFields(lr2,"//lr2");
      }
      private void printFields(Runnable r, String tag) {
          Field[] fields = r.getClass().getDeclaredFields();
          System.out.println(tag);
          for (Field field : fields) {
              System.out.println(field);
          }
      }
      

      结果

      //r
      final com.nailsoul.config.RedisConfig$1.this$0
      //lr
      private final int com.nailsoul.config.RedisConfig$$Lambda$1/1535128843.arg$1
      private final java.lang.String com.nailsoul.config.RedisConfig$$Lambda$1/1535128843.arg$2
      //lr2
      private final com.nailsoul.config.RedisConfig com.nailsoul.config.RedisConfig$$Lambda$2/1586270964.arg$1
      private final int com.nailsoul.config.RedisConfig$$Lambda$2/1586270964.arg$2
      private final java.lang.String com.nailsoul.config.RedisConfig$$Lambda$2/1586270964.arg$3
      
    • 总结

      局部变量和内部类成员final变量不是一个变量

      • 引用对象

        包含不可变对象 如String Integer 等
        局部变量和内部类成员final字段指定的引用地址一样
        即修改了任何一方的变量里面的属性 另一方也会被修改

      • 基本对象

        不包含包装对象 如Integer等
        内部类变量和局部变量都执行同一个字面常量值  不管怎么搞都不会互相影响

    分析

    内部类外面的局部变量不能被重复赋值否则会报错

    通过上面的测试我们已经知道局部类中的变量和局部变量不是同一个变量

    • 如果为局部变量重新赋值会导致内部类和局部变量值不一致 容易造成误导

      java 可能不是应为该原因 只是我猜测 
      因为如果是这原因的话 在内部类被创建前局部变量被修改是安全的
      也有可能是为了方便 只要修改了值 就报错
      不一致推论如下

      • 如果先定义局部变量x为3在创建内部类task
      • 为task定义run方法为打印变量x
      • 这时候task内的x为3
      • 修改局部变量x为5
      • 调用task的run方法  打印出来的会是3
      • 反之 定义局部变量x为3 内部类修改成5 局部变量还是3

      验证

      public void test(){
          Integer x = 3;
          Runnable r = new Runnable() {
              @Override
              public void run() {
                  int i = x;
                  Class<? extends Runnable> aClass = getClass();
                  Field field = ReflectionUtils.findField(aClass, "val$x");
                  field.setAccessible(true);
                  ReflectionUtils.setField(field,this,5);
              }
          };
          r.run();
          Field field = ReflectionUtils.findField(r.getClass(), "val$x");
          field.setAccessible(true);
          Object inner = ReflectionUtils.getField(field, r);
          System.out.println("inner:"+inner+",outer:"+x);
      }
      

      结果 因为内部类里的变量和局部变量不是同一个变量 
      所以修改内部类的变量的值 对局部变量没影响
      如果在内部类里修改x的value那就有影响了 
      因为它们指向的引用是同一个地址

      inner:5,outer:3
      
    在内部类里面不能修改局部类外面定义的变量的值

    经过前面发分析得知内部类里面的字段被final修饰 常规修改肯定会报错 
    通过反射可以修改 但是完全没必要 因为修改了没作用对局部变量没任何影响

    展开全文
  • lambda

    千次阅读 2019-09-19 18:55:40
    package lambda; /** lambda表达式 JDK8之后推出的新特性 lambda旨在让我们可以"以函数式编程".直观感受是可以用更简洁的方式创建匿名内部类 语法: (参数列表)->{ 方法体 } 使用lambda创建的匿名内部类实现...
  • 主要介绍了Lambda表达式里面修改外部变量的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • Java8 Lambda表达式教程

    万次阅读 多人点赞 2013-10-16 16:08:07
    Java8新特性,Lambda表达式与集合类bulk operation教程。迄今为止最全面的中文原创java lambda表达式教程。
  • var list2 = list.Select(x => { x.Info = x.Info.Trim(new char[] { ':', ':' }); return x; }).ToList(); 注意有{}: x => { x.Info = x.Info.Trim(new char[] { ':', ':' }); return x;...
  • Lambda

    2015-05-04 18:21:19
    Lambda 表达式探究 基本的语法格式 异同 向lambda 表达式传递参数 使用捕获列表 引用捕获 Lambda 表达式探究 第一次遇到lambda表达式是在学习C++ Primer 时,当时是在STL算法 那个章节,感兴趣的可以自行查阅。今天...
  • Talk is cheap, show me your ... * 在lambda表达式内部,修改lambda表达式外部的局部变量的值 */ private synchronized void updateLocalVariable() { List<String> list = new ArrayList<>(); ...
  • 因为平台用的是JDK8,而且发现自己对那些新特性好像一点都了解,就例如Lambda表达式,所以就开始对自己的代码进行改进了。。。  例如遍历Map,像我们正常遍历肯定是下面这样子的。 String result = "...
  • 意思是允许在Lambda表达式中修改使用的(外部)变量。不管是修改对象的引用还是修改基本类型的值都是可以的。 问题分析: @Test public void test1(){ List<String> list = new ArrayList(); Optional.of("aaa...
  • 传统的for 循环就写出来了 1 //将 数据源中姓钟的,并将他的年龄改成99岁 2 List<User> usersss =( from u in userlist 3 select u).ToList(); 4 // 方法一: 5 usersss = usersss....
  • 一、场景 最近做多语言的转换,例如【考场表】里有地址(Guid)、考场名(Guid),他们关联到了【多语言表】,多语言表目前有中英两种语言,需要写一个通用映射方法根据用户环境返回不同语言。 下文代码删减了部分业务...
  • lambda表达式

    2015-12-25 20:53:52
    lambda表达极大的简化的代码的书写,给java注入了一个新的生机。理解lambda表达式,有两个结果十分关键。第一个是lambda表达式自身,第二个是函数式接口。 lambda表达式本质上就是一个匿名函数,但是,这个方法不是...
  • 最近在使用java8提供的Lambda新特性,期间也踩了不少坑,这里记录一下 Lambda新特性–ForEach java8以前,我们通常用对集合的循环都是一下几种(例子:累加) public void test1() { List<Integer> list = ...
  • lambda详解

    2019-09-01 22:54:15
    lambda详解 lambda的应用场景主要简化函数代码 def func(a,b): ...写成lambda代码为: func = lambda a,b: a+b print(func) print(func(1,2)) 结果为: <function <lambda> at 0x000002...
  • 深入理解Lambda

    万次阅读 多人点赞 2016-03-10 17:18:43
    然而在使用它或是阅读Lambda代码的时候,却显得并那么容易。因为它匿名,因为它删减了一些必要的说明信息(比如方法名)。下面就来说说Lambda是如何进行转换和工作的吧。 版权说明 著作权归作者所有。 商业...
  • Lambda表达式

    2021-03-29 22:17:08
    使用 Lambda 表达式原因 Lambda 是一个匿名函数,可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力...
  • lambda 表达式

    热门讨论 2019-04-25 09:10:04
    lambda表达式 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 但是对于对Lambda表达式了解不够的程序员来说,理解和调试会有些困难。 ...
  • Lambda架构

    万次阅读 多人点赞 2018-07-11 21:15:04
    转载:...Marz在Twitter工作期间开发了著名的实时大数据处理框架Storm,Lambda架构是其根据多年进行分布式大数据系统的经验总结提炼而成。Lambda架构的目标是设...
  • c++ lambda

    2017-05-06 11:51:32
    #include using namespace std; //定义lambda auto f = [] {cout << "hello lambda" ; }; void lambda() { int a = 4; int b = 3; //若使用[=]捕获时能对a,b修改 [&] { ++a;

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,707
精华内容 45,482
关键字:

lambda改不了