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