Java 8里Map里有一个方法getOrDefault,定义如下:
default V getOrDefault(Object key, V defaultValue)
参数说明:
返回值:
使用时候的具体含义是:当去Map中(Java8的Map)去获取一个 key 对应的 value 时:
具体的我们看一个实例:
@Test
public void getOrDefault(){
// 假设定义一个,错误码和错误信息的映射
Map<String, String> hashMap = new HashMap<>();
hashMap.put("0000","交易成功");
hashMap.put("1000","交易失败");
hashMap.put("2000","处理中");
hashMap.put("3000","交易已取消");
System.out.println("---------------------原生操作----------------------");
// 假设取一个不存在的key:4000
String normalValue = hashMap.get("4000");
if (StringUtils.isBlank(normalValue)){
normalValue="交易未知";
}
System.out.println("常规方法取值:"+normalValue);
System.out.println("---------------------Java8 操作----------------------");
String value1 = hashMap.getOrDefault("0000", "交易未知");
System.out.println("正常取值结果:"+value1);
String value2 = hashMap.getOrDefault("4000", "交易未知");
System.out.println("带默认值取值结果:"+value2);
System.out.println("最终hashMap的值:"+hashMap.toString());
}
运行结果(Map里的值改变了):
---------------------原生操作----------------------
常规方法取值:交易未知
---------------------Java8 操作----------------------
正常取值结果:交易成功
带默认值取值结果:交易未知
最终hashMap的值:{0000=交易成功, 1000=交易失败, 2000=处理中, 3000=交易已取消}
Java 8里Map里有一个方法 compute,定义如下:
default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
参数说明:
返回值:
具体的我们看一个实例:
@Test
public void compute() {
// 假设我们定义一个订单号对应的金额的映射
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("S2021123100001", 200);
hashMap.put("S2021123100002", 400);
hashMap.put("S2021123100003", 600);
System.out.println("------------------------------模拟操作不存在的订单--------------------------------");
// 模拟操作不存在的订单
Integer noneExistValue = hashMap.compute("S2021123100004", (key, value) -> {
if (value == null) {
return value;
}
return value * 80 / 100;
});
System.out.println("操作一个不存在的key结果:" + noneExistValue);
System.out.println("最终hashMap的值:"+hashMap.toString());
System.out.println("-------------------------------模拟订单存在,总价打个8折-------------------------------");
// 模拟订单存在,总价打个8折
Integer existValue = hashMap.compute("S2021123100001", (key, value) -> {
if (value == null) {
return value;
}
return value * 80 / 100;
});
System.out.println("操作一个存在的key,计算结果不为空的结果:" + existValue);
System.out.println("最终hashMap的值:"+hashMap.toString());
System.out.println("-------------------------------模拟操作返回null-------------------------------");
// 模拟操作返回null
Integer nullValue = hashMap.compute("S2021123100003", (key, value) -> {
return null;
});
System.out.println("操作一个不存在的key,计算结果为空的结果:" + nullValue);
System.out.println("最终hashMap的值:"+hashMap.toString());
}
运行结果(注意Map里的值):
------------------------------模拟操作不存在的订单--------------------------------
操作一个不存在的key结果:null
最终hashMap的值:{S2021123100001=200, S2021123100002=400, S2021123100003=600}
-------------------------------模拟订单存在,总价打个8折-------------------------------
操作一个存在的key,计算结果不为空的结果:160
最终hashMap的值:{S2021123100001=160, S2021123100002=400, S2021123100003=600}
-------------------------------模拟操作返回null-------------------------------
操作一个不存在的key,计算结果为空的结果:null
最终hashMap的值:{S2021123100001=160, S2021123100002=400}
注意:这里一定要注意类型,不要写成如下方式了
hashMap.compute("S2021123100004", (key, value) -> value == null ? value : value * 80 / 100);
因为这里的value 的类型是Integer,如果是key存在,并且value不为null,能正常运行;当key不存在或者对应的value为null就会报空指针异常了。
Java 8里Map里有一个方法 computeIfAbsent,定义如下:
default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
参数说明:
返回值:
具体的我们看一个实例:
@Test
public void computeIfAbsent() {
// 假设我们定义水果英文和中文的映射
Map<String, String> hashMap = new HashMap<>();
hashMap.put("Apple", "苹果");
hashMap.put("Orange", "橘子");
hashMap.put("Banana", "香蕉");
System.out.println("-------------------------------模拟key存在-------------------------------");
String orange = hashMap.computeIfAbsent("Orange", key -> "西瓜");
System.out.println("操作存在的key的结果:"+orange);
System.out.println("最终hashMap的值:"+hashMap.toString());
System.out.println("-------------------------------模拟key不存在,计算后的值不为null(增加映射)-------------------------------");
String watermelon = hashMap.computeIfAbsent("watermelon", key -> "西瓜");
System.out.println("操作不存在的key,计算后的值不为null的结果:"+watermelon);
System.out.println("最终hashMap的值:"+hashMap.toString());
System.out.println("-------------------------------模拟key不存在,计算后的值为null-------------------------------");
String strawberry = hashMap.computeIfAbsent("strawberry", key -> null);
System.out.println("操作不存在的key,计算后的值为null的结果:"+strawberry);
System.out.println("最终hashMap的值:"+hashMap.toString());
}
运行结果(注意Map里的值):
-------------------------------模拟key存在-------------------------------
操作存在的key的结果:橘子
最终hashMap的值:{Apple=苹果, Orange=橘子, Banana=香蕉}
-------------------------------模拟key不存在,计算后的值不为null(增加映射)-------------------------------
操作不存在的key,计算后的值不为null的结果:西瓜
最终hashMap的值:{Apple=苹果, watermelon=西瓜, Orange=橘子, Banana=香蕉}
-------------------------------模拟key不存在,计算后的值为null-------------------------------
操作不存在的key,计算后的值为null的结果:null
最终hashMap的值:{Apple=苹果, watermelon=西瓜, Orange=橘子, Banana=香蕉}
Java 8里Map里有一个方法 computeIfPresent,定义如下:
default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
参数说明:
返回值:
具体的我们看一个实例:
@Test
public void computeIfPresent() {
// 假设我们定义一个订单号对应的金额的映射
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("S2021123100001", 200);
hashMap.put("S2021123100002", 400);
hashMap.put("S2021123100003", 600);
System.out.println("-------------------------------模拟key存在-------------------------------");
// 假设抽取到的订单,就给总价打个8折
Integer existValue = hashMap.computeIfPresent("S2021123100001", (key, value) -> value * 80 / 100);
System.out.println("操作一个存在的key结果:" + existValue);
System.out.println("最终hashMap的值:" + hashMap.toString());
System.out.println("-------------------------------模拟key不存在,,计算结果不为null-------------------------------");
Integer noneExistValue = hashMap.computeIfPresent("S2021123100004", (key, value) -> value * 80 / 100);
System.out.println("操作一个不存在的key,计算结果不为null结果:" + noneExistValue);
System.out.println("最终hashMap的值:" + hashMap.toString());
System.out.println("-------------------------------模拟key存在,计算结果为null(删除映射)-------------------------------");
Integer existKeyWithNullValue = hashMap.computeIfPresent("S2021123100002", (key, value) -> null);
System.out.println("操作一个存在的key,计算结果为null结果:" + existKeyWithNullValue);
System.out.println("最终hashMap的值:" + hashMap.toString());
}
运行结果(注意Map里的值):
-------------------------------模拟key存在-------------------------------
操作一个存在的key结果:160
最终hashMap的值:{S2021123100001=160, S2021123100002=400, S2021123100003=600}
-------------------------------模拟key不存在,,计算结果不为null-------------------------------
操作一个不存在的key,计算结果不为null结果:null
最终hashMap的值:{S2021123100001=160, S2021123100002=400, S2021123100003=600}
-------------------------------模拟key存在,计算结果为null(删除映射)-------------------------------
操作一个存在的key,计算结果为null结果:null
最终hashMap的值:{S2021123100001=160, S2021123100003=600}
Java 8里Map里有一个方法 putIfAbsent,定义如下:
default V putIfAbsent(K key, V value)
参数说明:
返回值:
具体的我们看一个实例:
@Test
public void putIfAbsent() {
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("shoes", 200);
hashMap.put("clothes", 300);
System.out.println("-------------------------------模拟key存在-------------------------------");
Integer shoes = hashMap.putIfAbsent("shoes", 250);
System.out.println("操作一个存在的key结果:" + shoes);
System.out.println("最终hashMap的值:" + hashMap.toString());
System.out.println("-------------------------------模拟key不存在-------------------------------");
Integer trousers = hashMap.putIfAbsent("trousers", 250);
System.out.println("操作一个不存在的key结果:" + trousers);
System.out.println("最终hashMap的值:" + hashMap.toString());
}
运行结果(注意Map里的值):
-------------------------------模拟key存在-------------------------------
操作一个存在的key结果:200
最终hashMap的值:{shoes=200, clothes=300}
-------------------------------模拟key不存在-------------------------------
操作一个不存在的key结果:null
最终hashMap的值:{trousers=250, shoes=200, clothes=300}
Java 8里Map里有一个方法 merge,定义如下:
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
参数说明:
返回值:
具体的我们看一个实例:
@Test
public void merge() {
Employee[] employeeArray = {
new Employee("BAT001", "胡昊天", "销售部", 28, 3500),
new Employee("BAT002", "王大锤", "销售部", 27, 3000),
new Employee("BAT003", "唐二鹏", "研发部", 32, 9900),
new Employee("BAT004", "王一林", "研发部", 30, 9000),
new Employee("BAT005", "梁南生", "研发部", 27, 8000),
new Employee("BAT006", "包三雅", "财务部", 25, 6000),
new Employee("BAT007", "罗考聪", "测试部", 35, 7400),
new Employee("BAT008", "徐浪生", "测试部", 24, 7000),
new Employee("BAT009", "胡俊伟", "研发部", 24, 4500),
new Employee("BAT010", "胡健儿", "人事部", 23, 4000),
new Employee("BAT011", "陶建伟", "运维部", 25, 8000),
new Employee("BAT012", "张萌萌", "行政部", 20, 3500)
};
List<Employee> list = Arrays.asList(employeeArray);
Map<String, Double> hashMap = new HashMap<>();
System.out.println("-------------------------------java8 写法(易理解)-------------------------------");
list.stream().forEach(studentScore -> hashMap.merge(studentScore.getDepartment(), studentScore.getSalary(), (oldValue, newValue) -> {
return oldValue + newValue;
}));
System.out.println("最终hashMap的值:" + hashMap.toString());
System.out.println("-------------------------------java8 精简写法-------------------------------");
Map<String, Double> map = new HashMap<>();
list.stream().forEach(studentScore -> map.merge(studentScore.getDepartment(), studentScore.getSalary(), Double::sum));
System.out.println("最终Map的值:" + map.toString());
}
运行结果(注意Map里的值):
-------------------------------java8 写法(易理解)-------------------------------
最终hashMap的值:{销售部=6500.0, 测试部=14400.0, 财务部=6000.0, 人事部=4000.0, 研发部=31400.0, 行政部=3500.0, 运维部=8000.0}
-------------------------------java8 精简写法-------------------------------
最终Map的值:{销售部=6500.0, 测试部=14400.0, 财务部=6000.0, 人事部=4000.0, 研发部=31400.0, 行政部=3500.0, 运维部=8000.0}