zoukankan      html  css  js  c++  java
  • 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);
        }
  • 相关阅读:
    android中listview分页加载数据
    android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)
    Opencv cvCircle函数
    我是怎样成长为系统架构师的
    C++游戏编程(一开篇)
    cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
    curl命令具体解释
    HDU 4334 Trouble
    美国地名大全(美国城市名称英文、中文)
    几种常见模式识别算法整理和总结
  • 原文地址:https://www.cnblogs.com/theRhyme/p/11577132.html
Copyright © 2011-2022 走看看