简单复习下
基本数据类型值传递
值传递,原变量的值不会被修改
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); }