代码编写
集合类API
- Map 集合computeIfAbsent:如果键不存在,则计算并插入值
java
Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("key1", k -> new ArrayList<>()).add("value1");如果该方法常用,可以封装成一个工具方法
java
public static <K, V> void putValue(Map<K, List<V>> map, K key, V value) {
map.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
}- Map 集合computeIfPresent:如果键存在,则根据当前值计算新值
java
Map<String, Integer> map = new HashMap<>();
map.put("count", "1");
map.computeIfPresent("count", (k, v) -> String.valueOf(Integer.parseInt(v) + 1)); // => "2"- Map 集合putIfAbsent:如果键不存在,才执行put
java
Map<String, String> map = new HashMap<>();
map.putIfAbsent("token", "abc123");集合类遍历方式
- for循环 + Entryset
java
for(Map.Entry<Integer,String> entry : map.entrySet()){
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}- Iterator + Entryset
java
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}- for循环 + KeySet(效率低)
java
for (String key : map.keySet()) {
System.out.println("key:" + key + ",");
System.out.println("value:" + map.get(key));
}- Iterator + Keyset(效率低)
java
Iterator<String> iterator=map.keySet().iterator();
while (iterator.hasNext()){
String key = iterator.next();
System.out.println(key);
System.out.println(map.get(key));
}- lambda表达式
java
map.forEach((key,value)->{
System.out.println(key);
System.out.println(value);
});Optional 的使用
- Optional.ofNullable(xxxx).orElse("")
java
String email = Optional.ofNullable(user.getEmail()).orElse("no-reply@example.com");- Optional.ofNullable(user.getEmail()).ifPresent()
java
Optional.ofNullable(user.getEmail()).ifPresent(e -> System.out.println("发送邮件给:" + e))- 对值做变换(链式调用)map(Function<? super T, ? extends U>)
java
String domain = Optional.ofNullable(user)
.map(User::getEmail)
.map(e -> e.substring(e.indexOf("@") + 1))
.orElse("default.com");- 对值做条件过滤 filter(Predicate<? super T>)
java
Optional<String> validEmail = Optional.ofNullable(user.getEmail())
.filter(e -> e.endsWith("@gmail.com"));
validEmail.ifPresent(System.out::println);Stream的Collectors.toMap()方法常见问题
- key不能有重复,否则会报错。java.lang.IllegalStateException: Duplicate key
java
# 解决方案
//key:姓名 value:性别
Map<String,String> map = list.stream().collect(Collectors.toMap(User::getName, User::getSex,(oldValue,newValue)->newValue));- value不能为空,否则报空指针。java.lang.NullPointerException
java
解决方案
//解决方案一,使用Optional类处理null 若value为空,设置默认值""
HashMap<String, String> map1 = list.stream()
.collect(Collectors.toMap(User::getName, s -> Optional.ofNullable(s.getSex()).orElse(""), (a, b) -> b));
//解决方案二,直接使用collect()方法进行规约操作 调用hashMap putAll方法, 注意key相同时,value会覆盖。
HashMap<String, String> map2 = list.stream()
.collect(HashMap::new, (map, item) -> map.put(item.getName(), item.getSex()), HashMap::putAll);