package org.nutz.lang.util;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import org.nutz.lang.born.Borning;
public interface NutBean extends Map<String, Object> {
boolean has(String key);
boolean is(String key, Object val);
/**
* 设置一个字段,如果值为 null 则表示移除
*
* @param key
* 键
* @param v
* 值
*/
void setOrRemove(String key, Object v);
Object get(String key, Object dft);
int getInt(String key);
int getInt(String key, int dft);
float getFloat(String key);
float getFloat(String key, float dft);
long getLong(String key);
long getLong(String key, long dft);
double getDouble(String key);
double getDouble(String key, double dft);
boolean getBoolean(String key);
boolean getBoolean(String key, boolean dft);
String getString(String key);
String getString(String key, String dft);
Date getTime(String key);
Date getTime(String key, Date dft);
<T extends Enum<T>> T getEnum(String key, Class<T> classOfEnum);
boolean isEnum(String key, Enum<?>... eus);
<T> T getAs(String key, Class<T> classOfT);
<T> T getAs(String key, Class<T> classOfT, T dft);
/**
* 将一个字段转换成列表。因为返回的是容器,所以本函数永远不会返回 null
*
* @param <T>
* @param key
* 键
* @param eleType
* 列表元素类型
* @param dft
* 默认值
* @return 列表对象,如果字段不存在或者为空,则返回一个空列表
*/
<T> List<T> getList(String key, Class<T> eleType, List<T> dft);
/**
* @see #getList(String, Class, List)
*/
<T> List<T> getList(String key, Class<T> eleType);
/**
* 将一个字段转换成数组。因为返回的是容器,所以本函数永远不会返回 null
*
* @param <T>
* @param key
* 键
* @param eleType
* 数组元素类型
* @param dft
* 默认值
* @return 数组对象,如果字段不存在或者为空,则返回一个空数组
*/
<T> T[] getArray(String key, Class<T> eleType, T[] dft);
/**
* @see #getArray(String, Class, Object[])
*/
<T> T[] getArray(String key, Class<T> eleType);
NutBean addv(String key, Object value);
NutBean setv(String key, Object value);
void unset(String key);
NutBean setAll(Map<String, Object> map);
/**
* 从 Map 里挑选一些键生成一个新的 Map
*
* @param keys
* 键
* @return 新 Map
*/
NutBean pick(String... keys);
/**
* 从 Map 里挑选一些键生成一个新的 Map,自己同时删除这些键
*
* @param keys
* 键
* @return 新 Map
*/
NutBean pickAndRemove(String... keys);
/**
* 从 Map 里挑选一些键生成一个新的 Map
*
* @param regex
* 匹配键的正则表达式,"!" 开头,表示取反
* @return 新 Map
*/
NutBean pickBy(String regex);
/**
* 从 Map 里挑选一些键生成一个新的 Map
*
* @param p
* 匹配键的正则表达式,null 不会匹配任何一个键
* @param isNot
* true 表示被匹配上的会被忽略,false 表示被匹配上的才加入到返回的集合里
* @return 新 Map
*/
NutBean pickBy(Pattern p, boolean isNot);
/**
* 从 Map 里挑选一些键生成一个新的 Map,自己同时删除这些键
*
* @param p
* 匹配键的正则表达式,null 不会匹配任何一个键
* @param isNot
* true 表示被匹配上的会被忽略,false 表示被匹配上的才加入到返回的集合里
* @return 新 Map
*/
NutBean pickAndRemoveBy(Pattern p, boolean isNot);
/**
* 从 Map 里将指定的键过滤,生成一个新的 Map
*
* @param keys
* 键
* @return 新 Map
*/
NutBean omit(String... keys);
/**
* 如果一个键的值无效(has(key) 返回 false),那么为其设置默认值
*
* @param key
* 键
* @param dft
* 值
* @return 自身以便链式赋值
*/
NutBean putDefault(String key, Object dft);
NutBean setMap(Map<?, ?> map, boolean ignoreNullValue);
/**
* 相当于 mergeWith(map, false)
*
* @see #mergeWith(Map, boolean)
*/
NutBean mergeWith(Map<String, Object> map);
/**
* 与一个给定的 Map 融合,如果有子 Map 递归
*
* @param map
* 要合并进来的 Map
* @param onlyAbsent
* true 表示只有没有 key 才设置值
* @return 自身以便链式赋值
*/
NutBean mergeWith(Map<String, Object> map, boolean onlyAbsent);
/**
* 与JDK8+的 putIfAbsent(key, val)一致, 当且仅当值不存在时设置进去,但与putIfAbsent返回值有不一样
*
* @param key
* 键
* @param val
* 值
* @return 当前实例
*/
NutBean setnx(String key, Object val);
/**
* 将一个集合与自己补充(相当于针对每个 key 调用 setnx)
*
* @param map
* 集合
* @return 自身
*
* @see #setnx(String, Object)
*/
NutBean setnxAll(Map<String, Object> map);
/**
* 获取对应的值,若不存在,用factory创建一个,然后设置进去,返回之
*
* @param key
* 键
* @param factory
* 若不存在的话用于生成实例
* @return 已存在的值或新的值
*/
<T> T getOrBorn(String key, Borning<T> factory);
/**
* 将自身作为一个条件,看看给定的 Map 是否全部满足这个条件
* <p>
* 注意,字符串型的值有下列意义
* <ul>
* <li>"^xxxxx" : 正则表达式
* <li>"" : 相当于 Blank
* </ul>
*
* @param map
* 给定的 Map
* @return 是否匹配
*/
boolean match(Map<String, Object> map);
}