1:List包装优化
我们在项目中,经常碰到List需要连续赋值的情况。比如List.add(1);List.add(2);…………
那么怎么能让我们的代码看起来更优雅,用起来更舒适一些呢?
下面来给大家看一个例子:
具体实现代码如下:
ListAddConsumer.java
package com.gf.framework.common.utils.list;
/**
* @author gaofei
* @date 2022/6/12 20:24
*/
public interface ListAddConsumer <E, T>{
E apply(T data);
}
GfList.java
package com.gf.framework.common.utils.list;
import java.util.Collection;
import java.util.List;
/**
* @author gaofei
* @date 2022/6/12 18:31
*/
public interface GfList<E> extends List<E> {
default GfList<E> addAll(E... es) {
for (E e : es) {
add(e);
}
return this;
}
default GfList<E> of(E... es) {
return addAll(es);
}
default <T> GfList<E> addAll(Collection<T> es, ListAddConsumer<E, T> listAddConsumer) {
for (T e: es) {
add(listAddConsumer.apply(e));
}
return this;
}
}
GfLinkedList.java
package com.gf.framework.common.utils.list;
import lombok.NoArgsConstructor;
import java.util.LinkedList;
/**
* @author gaofei
* @date 2022/6/12 19:34
*/
@NoArgsConstructor
public class GfLinkedList<E> extends LinkedList<E> implements GfList<E> {
public GfLinkedList(E... es) {
of(es);
}
}
GfArrayList.java
package com.gf.framework.common.utils.list;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
/**
* @author gaofei
* @date 2022/6/12 19:33
*/
@NoArgsConstructor
public class GfArrayList<E> extends ArrayList<E> implements GfList<E> {
public GfArrayList(E... es) {
of(es);
}
}
2:Map包装优化
同样的,Map结构,我们也会经常碰到需要连续添加n个值的情况,下面来看一个使用范例:
具体实现代码如下:
GfMap.java
package com.gf.framework.common.utils.map;
import java.util.Collection;
import java.util.Map;
/**
* @author gaofei
* @date 2022/6/12 19:37
*/
public interface GfMap<K, V> extends Map<K, V> {
default GfMap<K, V> of(K k, V v) {
put(k, v);
return this;
}
/**
* k 和 v不能是null
* @param k
* @param v
* @return
*/
default GfMap<K, V> ofNotNull(K k, V v) {
if (k == null || v == null) {
return this;
}
put(k, v);
return this;
}
default GfMap<K, V> putNotNull(K k, V v) {
return ofNotNull(k, v);
}
default <T> GfMap<K, V> putAll(Collection<T> objects, KVConsumer<K, V, T> consumer) {
for (T data: objects) {
put(consumer.key(data), consumer.value(data));
}
return this;
}
default <T> GfMap<K, V> putAll(T[] objects, KVConsumer<K, V, T> consumer) {
for (T data: objects) {
put(consumer.key(data), consumer.value(data));
}
return this;
}
}
KVConsumer.java
package com.gf.framework.common.utils.map;
/**
* @author gaofei
* @date 2022/6/12 20:02
*/
public interface KVConsumer<K, V, T> {
K key(T t);
V value(T t);
}
GfTreeMap.java
package com.gf.framework.common.utils.map;
import lombok.NoArgsConstructor;
import java.util.Comparator;
import java.util.TreeMap;
/**
* @author gaofei
* @date 2022/6/12 19:39
*/
@NoArgsConstructor
public class GfTreeMap<K, V> extends TreeMap<K, V> implements GfMap<K, V> {
public GfTreeMap(Comparator<? super K> comparator) {
super(comparator);
}
}
GfHashMap.java
package com.gf.framework.common.utils.map;
import java.util.HashMap;
import java.util.Map;
/**
* @author gaofei
* @date 2022/6/12 19:39
*/
public class GfHashMap<K, V> extends HashMap<K, V> implements GfMap<K, V>, Map<K, V> {
}
GfConcurrentHashMap.java
package com.gf.framework.common.utils.map;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author gaofei
* @date 2022/6/12 19:40
*/
public class GfConcurrentHashMap<K, V> extends ConcurrentHashMap<K, V> implements GfMap<K, V> {
}