• 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);
        }
  • 相关阅读:
    switch_goto
    隐藏 窗口的整个 标题栏(包括右上角的关闭)
    asp的邦定表达式异常 <_ %_ = strParentid _%_>不能传到下个页面
    【收藏】default.rdp配置
    计算机网络中的性能指标
    当某个快捷键不能用时很可能是热键冲突
    java的FOR循环 打印三角形
    二进制 八进制 十进制 十六进制
    linux的vim编辑命令常用
    JIRA的备份
  • 原文地址:https://www.cnblogs.com/theRhyme/p/11577132.html
Copyright © 2020-2023  润新知