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);
        }
  • 相关阅读:
    iOS很重要的 block回调
    怎样写具体设计文档
    ORM框架
    RapidXml用法
    【Android Training
    ORACLE触发器具体解释
    LeetCode 131 Palindrome Partitioning
    Git管理工具对照(GitBash、EGit、SourceTree)
    Android下将图片载入到内存中
    怎样破解邮箱password
  • 原文地址:https://www.cnblogs.com/theRhyme/p/11577132.html
Copyright © 2011-2022 走看看