Skip to content

代码编写

集合类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);

Last updated: