Java 中函数式编程方法形参为基本类型和引用类型 - rhyme

theRhyme 2021-08-03 原文


Java 中函数式编程方法形参为基本类型和引用类型

简单复习下

基本数据类型值传递

值传递,原变量的值不会被修改

private final Consumer sout = System.out::println;

    @Before
    public void init() {
    }

    /**
     * 基本数据类型值传递
     * 值传递,原变量的值不会被修改
     */
    @Test
    public void basicDataType() {
        final BiConsumer<Integer, Integer> biConsumer = (a, b) -> {
            // 11 ^ 101 = 110
            a = a ^ b;
            // 110 ^ 101 = 011
            b = a ^ b;
            // 110 ^ 011 = 101
            a = a ^ b;
        };

        int a = 3, b = 5;
        biConsumer.accept(a, b);

        sout.accept(a);
        sout.accept(b);
    }

 

传递数组类型的引用

结果值全部为1,全部被修改

@Test
    public void array() {
        Consumer<int[]> consumer = (int[] arr) -> Arrays.fill(arr, 1);
        int[] arr = {1, 2, 3, 4, 5};
        consumer.accept(arr);

        for (int i = 0; i < arr.length; i++) {
            sout.accept(arr[i]);
        }
    }

 

方法形参为对象

* 如果在方法内部修改该对象的属性,外部引用属性值会跟着变化
* 如果在方法内部修改该引用,外部不会发生变化

@Test
    public void object() {
        Consumer<DotaHero> setNameSF = (d) -> d.setName("SF");
        DotaHero sf = new DotaHero();
        setNameSF.accept(sf);

        // DotaHero(name=SF, kind=null, sex=null)
        // 引用的属性被修改
        sout.accept(sf);

        DotaHero karl = new DotaHero();
        karl.setName("karl");

        BiConsumer<DotaHero, DotaHero> swap = (s, k) -> {
            DotaHero temp;
            temp = s;
            s = k;
            k = temp;
        };

        // 未被更改
        // DotaHero(name=SF, kind=null, sex=null)
        // DotaHero(name=karl, kind=null, sex=null)
        sout.accept(sf);
        sout.accept(karl);


        Consumer<DotaHero> setNameKarl = (d) -> {
            DotaHero temp = d;
            temp.setName("karl");
        };

        setNameKarl.accept(sf);
        // 被更改
        // DotaHero(name=karl, kind=null, sex=null)
        sout.accept(sf);
    }

 

发表于
2019-09-24 11:01 
rhyme 
阅读(509
评论(0
编辑 
收藏 
举报

 

版权声明:本文为theRhyme原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/theRhyme/p/11577132.html

Java 中函数式编程方法形参为基本类型和引用类型 - rhyme的更多相关文章

  1. Elasticsearch如何有惊无险地入门,我是用心的

    学习真的是一件令人开心的事情,上次分享了 Redis 入门的文章后,收到了很多小伙伴的鼓励,比如说:“哎呀,不 […]...

  2. 计算机网络基础 + 部分面试题

    概述 1. 电路交换的步骤 建立连接 通话:一直占用通信资源 释放连接:归还通信资源 2. 带宽 ​ 通道传送 […]...

  3. 【转载】agentzh 的 Nginx 教程(版本 2016.07.21) – 不吃香菜真

    【转载】agentzh 的 Nginx 教程(版本 2016.07.21) 目录 缘起 Nginx 教程的连载 […]...

  4. 01背包问题的详细概述 – William_xh

    01背包问题的详细概述 对于背包问题,林喵喵推荐我看了dd大佬的背包九讲,在此附上链接:http://blog […]...

  5. sqlServer 为表字段添加说明 – 忙碌ing

    sqlServer 为表字段添加说明   EXECUTE sp_addextendedproperty N\' […]...

  6. offsetWidth、clientWidth、width、scrollWidth区别及js与jQuery获取的方式 – 龙果果

    offsetWidth、clientWidth、width、scrollWidth区别及js与jQuery获取 […]...

  7. 【面试】一篇文章帮你彻底搞清楚“I/O多路复用”和“异步I/O”的前世今生

    曾经的VIP服务在网络的初期,网民很少,服务器完全无压力,那时的技术也没有现在先进,通常用一个线程来全程跟踪处 […]...

  8. 【功耗测试环境预置自动化脚本开发】【切换wifi模式为siso模式】【用到方法*args】 – Pyguo

    【功耗测试环境预置自动化脚本开发】【切换wifi模式为siso模式】【用到方法*args】 import os […]...

随机推荐

  1. 纵横十里投资百亿,图扑赋能新基建下的隧道可视化运用

    随着我国经济快速发展,全国交通基础设施进展迅速,我国已经成为世界上隧道最多,建设速度最快的国家。在新基建模式下 […]...

  2. python利用文件对话框获取文件路径

    一、单文件 python3: 1 import tkinter as tk 2 from tkinter im […]...

  3. 数据库Oracle和MySQL 的不同

    实例区别: MySQL是轻量型数据库,开源免费。Oracle收费,这个不是重点,,重点是它贵。 MySQL一个 […]...

  4. Unreal Engine 4 蓝图完全学习教程(三)—— 节点的基本知识

    关于UE4蓝图中节点的知识及简单例子 Ⅰ、节点的种类 ①标题:在节点的上方显示着节点的标题,标题部分会根据节点 […]...

  5. iPhone/iPad被停用怎么办 3招轻松解锁 – imsoft

    iPhone/iPad被停用怎么办 3招轻松解锁  家中小孩玩电脑游戏,自己拿了iPad,随便输入密码,结果造 […]...

  6. vue2中$emit $on $off实现组件之间的联动,绝对有你想了解的

    在vue2开发中,你肯定会遇到组件之间联动的问题,现在我们就来说说哪个神奇的指令可以满足我们的需求。 一、先上 […]...

  7. 三极管的应用

    如果我们用三极管做一个几Mhz的开关,怎样通过外围设计提高开关的频率,又使信号尽量的不失真。通过实际测试,我发 […]...

  8. 移动端页面利用好viewport,适配各种宽度屏幕

    最近研究微贷网的移动端代码,发现他们网站在适配不同宽度屏幕的显示情况时,发现他们并不是利用rem单位,而是利用 […]...

展开目录

目录导航