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);
        }
  • 相关阅读:
    【转】以太坊分片:Overview and Finality
    Raiden Network — Ethereum 区块链支付通道
    ERC 和 EIP 代表什么呢?
    【转】什么是加密经济学
    Ethereum Probabilistic Micropayments
    【转】以太坊钱包分析与介绍
    【转】用Python从零开始创建区块链
    【转】用 Go 构建一个区块链
    通用权限管理系统组件 (GPM
    通用权限管理系统组件 (GPM
  • 原文地址:https://www.cnblogs.com/theRhyme/p/11577132.html
Copyright © 2011-2022 走看看