Java 8 Collection 新方法实用小手册

core-java
标签: #<Tag:0x00007f1d26e01d08>

#1

Collection中新增的一些方法主要是为了支持 Lambda. 而且这些方法的参数大多都支持 Lambda 表达式

List 中会用到的新方法

forEach()

list 中的每个元素都和执行 action()

default void forEach(Consumer<? super T> action)
public interface Consumer<T> {
    void accept(T t);
}

removeIf()

删除 list 中所有 test()返回true的元素

default boolean removeIf(Predicate<? super E> filter)
public interface Predicate<T> {
    boolean test(T t);
}

replaceAll()

对每个元素执行 apply() 方法并用返回的结果替换原元素

default void replaceAll(UnaryOperator<E> operator)
public interface UnaryOperator<T> extends Function<T, T> {
    static <T> UnaryOperator<T> identity() {
        return t -> t;
    }
}
public interface Function<T, R> {
    R apply(T t);
}

sort()

对 list 排序

default void sort(Comparator<? super E> c) 
public interface Comparator<T> {
    int compare(T o1, T o2);
}

Map会用到的方法

forEach()

对每个元素执行 accept() 方法, 第一个参数是 key, 第二个是 value

default void forEach(BiConsumer<? super K, ? super V> action)
public interface BiConsumer<T, U> {
    void accept(T t, U u);
}

getOrDefault()

不是 lambda 表达式, 返回 key 对应的 value, 如果key 不存在则返回默认值

default V getOrDefault(Object key, V defaultValue)

putIfAbsent()

不是 lambda, 如果 key 不存在才将元素加入 map 中

default V putIfAbsent(K key, V value)

remove()

不是 lambda, key和 value 同时存在才删除

default boolean remove(Object key, Object value)

replace(K key, V value)

不是 lambda, 只有 key 值存在才会把 key 对应的值替换为 value

default V replace(K key, V value)

replace(K key, V oldValue, V newValue)

不是 lambda, 只有当 key 和 oldValue同时存在时, 才把 oldValue 替换为 newValue

default boolean replace(K key, V oldValue, V newValue)

replaceAll()

对每个元素都执行 apply 方法, 并用 apply(key, value) 返回的value替换原key 对应的 value

default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

merge()

merge key对应的 value 的值, 如果 key 不存在, 相当于 put,
如果存在, 则调用apply(v1, v2), 第一个参数是旧值, 第二个是新值, 也就是 merge 的第二个参数.
如果 apply 返回 null, 则在 map 中删除此元素

default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

例子:

map.merge("2", "b", (v1, v2) -> v1 + v2);

compute()

如果 key 对应的 value 为null, 调用 apply 方法, 把 apply 方法返回的值作为 value 存入 map, 并返回 value
如果 key 对应的 value 不为 null,
调用 apply 方法, 把 apply 方法返回的值作为 value 覆盖原 oldValue, 并返回 value
如果 apply 返回 null, 删除此元素

default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

例子

Map<Integer, Set<String>> map2 = new HashMap<>();
map2.compute(1, (key, value) -> new HashSet<String>()).add("one"); // {1=[one]}
map2.compute(1, (key, value) -> new HashSet<String>()).add("two"); // {1=[two]}
map2.compute(1, (key, value) -> null);  // {}

computeIfAbsent()

如果 key 对应的 value 不为 null, 直接返回 value, 不执行 apply 方法
如果 key 对应的 value 为null, 先调用 apply 方法, 把 apply 方法返回的值作为 value 存入 map, 并返回 value

default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
public interface Function<T, R> {
    R apply(T t);
}
Map<Integer, Set<String>> map = new HashMap<>();
map.computeIfAbsent(1, v -> new HashSet<String>()).add("one");
map.computeIfAbsent(1, v -> new HashSet<String>()).add("two");

computeIfPresent()

如果 key 对应的 value 为 null 时, 返回 null
如果 key 对应的 value 不为 null 时, 调用 apply(key, oldValue) 方法, 并用返回的 value 替换原 value. 如果apply方法返回空, 则删除此元素.

default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

例子

Map<Integer, Set<String>> map2 = new HashMap<>();
map2.computeIfPresent(1, (key, value) -> new HashSet<String>()).add(“one”); // NullPointerException