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);
    }
原文地址:https://www.cnblogs.com/theRhyme/p/11577132.html