在工作中遇到需要对某些参数进行业务逻辑过滤处理,在原方法中过滤成功。将业务过滤代码抽成公共方法后,过滤失败。当时情况如下:

原代码:

public static void main(String[] args) {Boolean filter = true;List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);if (filter) {List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());list = collect;}else {List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());list = collect;}System.out.println(list);
}

抽出业务代码为公共方法后:

public static void main(String[] args) {Boolean filter = true;List<Integer> test = new ArrayList<>();doFilter(filter, test);System.out.println(test);
}private static void doFilter(Boolean filter, List<Integer> list) {list.add(1);list.add(2);list.add(3);list.add(4);if (filter) {List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());list = collect;}else {List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());list = collect;}
}

如上所示,将业务抽成方法后过滤逻辑失效了,这个问题原因涉及到指针和java的引用传递。

mian 函数中的test 指向内存地址addr1,调用doFilter方法时test作为参数传进去,list参数也指向了addr1。在if 判断中,list 过滤出一个新的集合collect ,这时collect 的地址为addr2 ,执行list = collect 后,参数list 的值变成了我们理想中的值,但list 指向的地址为addr2,也就是说我们实际想要的值地址是addr2。而main 函数中test 的地址为addr1 。

要避免这种情况,就需要将list 参数作为函数返回值返回,将main 函数中的test 地址指向addr2。

public static void main(String[] args) {Boolean filter = true;List<Integer> test = new ArrayList<>();test = doFilter(filter, test);System.out.println(test);
}private static List<Integer> doFilter(Boolean filter, List<Integer> list) {list.add(1);list.add(2);list.add(3);list.add(4);if (filter) {List<Integer> collect = list.stream().filter(value -> value > 2).collect(Collectors.toList());list = collect;}else {List<Integer> collect = list.stream().filter(value -> value < 2).collect(Collectors.toList());list = collect;}return list;
}

JAVA引用传递导致的方法中重新赋值失败相关推荐

  1. java引用传递_理解Java中的引用传递和值传递

    关于Java传参时是引用传递还是值传递,是一个讨论比较多的话题, 有说Java中只有值传递,也有些地方说引用传递和值传递都存在,本篇记录思考过程,不保证正确性, 感兴趣的同学一起讨论. 1.基本类型和 ...

  2. java 地址传递 返回值_Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  3. java自定义方法参数注解_Java方法中的参数太多,第1部分:自定义类型

    java自定义方法参数注解 我认为构造函数和方法中冗长的参数列表是Java开发中的另一个" 危险信号 ",就逻辑和功能而言,它们不一定是"错误的",但通常暗示当 ...

  4. java引用传递关键字_Java值传递和引用传递

    Java值传递和引用传递 1 什么是Java值传递和引用传递 在Java中只有值传递,而没有引用调用.如果我们调用传递值的方法,则称为按值调用.在调用方法中完成的更改在调用方法时不受影响. 2 Jav ...

  5. c语言的指针和java引用传递参数,java传参数是传值还是引用

    1.基参数是本数据类型 传递是值(或者说值得副本). 2.参数是对象的话传递的是对象引用的副本.(1.修改引用副本指向新对象不会影响原来对象,2.修改引用指向的对象的属性会修改成功,3.如果传递时st ...

  6. java 数组传递是引用吗_数组是通过值传递还是通过Java引用传递?

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Is Java"pass-by-reference"? 数组不是Java中的原始类型,但它们也不是对 ...

  7. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

  8. java引用传递106_(转载)java的值传递与引用传递

    1 说明:本文的适用对象为java初学者.如果有读者发现文章中有叙述不妥之处,请指正.2 3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交.有人说java只 ...

  9. java 构建者模式_Java方法中的参数太多,第3部分:构建器模式

    java 构建者模式 在我的前两篇文章中,我研究了如何通过自定义类型和参数对象减少构造函数或方法调用所需的参数数量. 在本文中,我将讨论如何使用构建器模式来减少构造器所需的参数数量,并讨论该模式如何甚 ...

最新文章

  1. LVS_NAT实现负载均衡
  2. n2n linux,n2n安装
  3. 201126阶段二单例数据库及MVC设计模式
  4. Spark入门(十)之Distinct去重
  5. high-speed A/D performance metrics and Amplifie...
  6. UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
  7. 解决RStudio(非conda安装)在使用Anaconda中的R环境时,缺失“ libbz2-1.dll ”而不能正常启动问题
  8. 文档中某些特定数据查询
  9. Linux 用户空间审计系统
  10. Linux如何创建makefile文件,如何在Linux上为gcc创建简单的makefile?
  11. 10+必备的 WORDPRESS 常用插件
  12. 【无标题】How to Programe 2021 GMC Terrain Smart Key Programming by Autel IM508
  13. ERROR in Entry module not found: Error: Can‘t resolve ‘./src/index.js‘ in‘xxx.js‘
  14. vue制作子组件以及在父组件中引入子组件
  15. 两个经纬度偏角_[转载]根据两点的经纬度求方位角和距离,等
  16. js中小括号()的用法详解
  17. 【c++】2020大一下c++期中考前小练习1
  18. spring用到的设计模式
  19. 微信小程序支付,微信支付【小白专用】
  20. tp6框架结合阿里短信接口发送短信并记录redis

热门文章

  1. Glossary - 术语对照表 4
  2. gitlab查看用户id
  3. Android 的上下文菜单: Context Menu,registerForContextMenu(getListView())
  4. Field userClient in cn.itcast.order.service.OrderService required a bean of type ‘com.example.feign.
  5. h5移动端判断浏览器类型
  6. 静默活体检测能力,有效规避用户实名认证环节风险
  7. Algorithm:树结构(二叉树/多路查找树/字典树)的简介、具体结构(FBT/CBT/BST/BBT/Heap/Huffman、B树/B+树/R树、字典树)及其运算(增删查/遍历/旋转)、代码实现
  8. 【无BUG解决】Windows 10 家庭版 修改C盘Users下的中文用户名
  9. CSS表格和表单设置
  10. 新零售模式有新玩法 个人如何抓住这波红利?