NutzCN Logo
精华 想总结 Nutz 100 个细节,大家有没有什么平时用的觉得很贴心的细节?
发布于 2765天前 作者 zozoh 14376 次浏览 复制 上一个帖子 下一个帖子
标签:

想最后总结出一个列表,列出 Nutz 100 个与其他框架不同的细节,对于这个细节要求是:

  1. 你觉得很贴心
  2. 你认为大家可能没注意到(注意,你觉得 可能 即可)
  3. 最好是其它框架没有的,或者是做的不太好的

我先来抛砖引玉:

细节1: 未实现的异常

很多时候,你会先写一个实现类的样子,打算稍后再填充实现代码。但是整个系统运行时,如果调用到你这部分代码,你希望最好抛一个异常
Nutz 竟然在这点也做了考虑,譬如:

public String getSomeString(){
     throw Lang.noImplement();
}

看看我们能总结多少细节 ^_^

31 回复

感觉nutz在某些方面有些像锤子科技(罗),跟罗一样被一部分人所欣赏和钟爱,还有一些说不出的情怀与自豪感。
另外就是nutz低调不吹嘘,开开心心做开源,踏踏实实的写好代码,技术氛围很好。

主键生成器:
POJO类通过 @Prev 注解 结合EL 表达式来实现主键生成功能,简直太灵活、太方便了

@Prev(els = {@EL("uuid()")})

@Prev(els = {@EL("ig(view.tableName,'')")})

//注册主键生成器
CustomMake.me().register("ig", ioc.get(RedisIdGenerator.class));

链式操作:

NutMap.NEW().addv().addv()
Cnd.NEW().and().and()

社区非非常活跃,发帖提问秒回!贴心

细节3: NutMap 一个非常好用的 Map 类

JDK 提供的各种 Map 实现有各自的优点和缺点。Nutz 给出了一个在大多数时候都比较适用的 Map 实现,让你管理 Map 数据更加方便

  1. NutMap 直接继承 LinkedHashMap,所以保持了键的顺序,也兼顾了读取速度
  2. 它直接是 LinkedHashMap<String, Object> 因此你不用再次指定键和值的类型,String:Object 的键值设定满足绝大多数场景
  3. 因为值是 Object,你可以用 map.getInt("xxx") 这种形式转换值(这个用到了 nutz.castors)包,对于大多数场景都能很好的转换数据
  • 支持 getInt | getFloat | getBoolean | getString | getTime | getEnum | getAs 等,这个可以参看 org.nutz.lang.util.NutBean 接口
  1. 提供了 pickBy("^(a.+)$") 函数,可以支持用正则表达式过滤键。同时正则表达式也支持 "!^(a.+)$" 这样的取反写法
  2. 可以递归融合两个 Map,不同于 putAllmap.mergeWith 与一个给定的 Map 融合,如果有子 Map 则递归
  3. addv(key, value) 为 Map 增加一个名值对。如果同名已经有值了,那么会将两个值合并成一个列表
  4. 支持 match(Another Map), 与另外一个 Map 计算匹配。另外的 Map 支持用正则表达式,来匹配值
  5. 支持 intDecrement(key) | intDecrement(key) 这样的快捷操作

细节3: NutMap 一个非常好用的 Map 类

JDK 提供的各种 Map 实现有各自的优点和缺点。Nutz 给出了一个在大多数时候都比较适用的 Map 实现,让你管理 Map 数据更加方便

  1. NutMap 直接继承 LinkedHashMap,所以保持了键的顺序,也兼顾了读取速度
  2. 它直接是 LinkedHashMap<String, Object> 因此你不用再次指定键和值的类型,String:Object 的键值设定满足绝大多数场景
  3. 因为值是 Object,你可以用 map.getInt("xxx") 这种形式转换值(这个用到了 nutz.castors)包,对于大多数场景都能很好的转换数据
  • 支持 getInt | getFloat | getBoolean | getString | getTime | getEnum | getAs 等,这个可以参看 org.nutz.lang.util.NutBean 接口
  1. 提供了 pickBy("^(a.+)$") 函数,可以支持用正则表达式过滤键。同时正则表达式也支持 "!^(a.+)$" 这样的取反写法
  2. 可以递归融合两个 Map,不同于 putAllmap.mergeWith 与一个给定的 Map 融合,如果有子 Map 则递归
  3. addv(key, value) 为 Map 增加一个名值对。如果同名已经有值了,那么会将两个值合并成一个列表
  4. 支持 match(Another Map), 与另外一个 Map 计算匹配。另外的 Map 支持用正则表达式,来匹配值
  5. 支持 intDecrement(key) | intDecrement(key) 这样的快捷操作

甜心的语法糖 (工具包)

很多时候我们需要做些数据的比较,脱敏数据,加密数据等,这些Nutz都给你考虑到了,很是贴心,举个粟子:

public String displayPhoneNum(String phoneNum) {
     return Strings.brief(phoneNum, 5);
}

最贴心的还是大佬们有求必应的回帖啊……

我来一个,Json格式化

 /**
     * 将一个 JAVA 对象转换成 JSON 字符串,并且可以设定 JSON 字符串的格式化方式
     * 
     * @param obj
     *            JAVA 对象
     * @param format
     *            JSON 字符串格式化方式 ,若 format 为 null ,则以 JsonFormat.nice() 格式输出
     * @return JSON 字符串
     */
    public static String toJson(Object obj, JsonFormat format) {
        StringBuilder sb = new StringBuilder();
        toJson(Lang.opw(sb), obj, format);
        return sb.toString();
    }

临时文件池:

    @Inject("refer:tmpFilePool")
    private NutFilePool tmpFilePool;

    tmpFilePool.createFile(".jpg");
    long fileId = tmpFilePool.getFileId(tf.getFile());
    tmpFilePool.getFile(fileId,"jpg");
    Pools.getFileById(new File("D://tmp"),1,".jpg");

检查字符是否为空

Strings.isBlank(longitude) 

NutMap 可以支持 pickBy 挑选一些键生成新 Map

public NutMap pick(String... keys) 
public NutMap pickAndRemove(String... keys) 
public NutMap pickBy(String regex)
public NutMap pickBy(Pattern p, boolean isNot)
public NutMap pickAndRemoveBy(String regex)
public NutMap pickAndRemoveBy(Pattern p, boolean isNot)

El类的eval方法可以快速取出深层对象

从当前线程上下文直接拿到HttpServletRequest,HttpServletResponse和HttpSession,方便的一笔

        Mvcs.getReq();
        Mvcs.getResp();
        Mvcs.getHttpSession();

直接抛出异常,方便的一笔

throw Lang.makeThrow("对方不想写自定义异常,直接用%s抛出了一个异常","nutz");

更友好的Map,链式操作,多类型获取,便捷构造等,方便的一比

        NutMap nutMap = NutMap.NEW().addv("name", "wendal").addv("age", "18").setv("is_cool", true).addv("money", 9999999999999L);
        System.out.println(nutMap.getString("name"));
        System.out.println(nutMap.getInt("age"));
        System.out.println(nutMap.getBoolean("is_cool"));
        System.out.println(nutMap.getLong("money"));


        String str = "{ nutz:666,vuejs:555 }";
        NutMap nm = new NutMap(str);
        System.out.println(nm);
        

更统一友好的日志工具类

Logs.get().debug("方便的一笔");

Files.write
将内容写到一个文件内,内容对象可以是:
1、InputStream - 按二进制方式写入
2、byte[] - 按二进制方式写入
3、Reader - 按 UTF-8 方式写入
4、其他对象被 toString() 后按照 UTF-8 方式写入

占位符替换工具类:

    public static void main(String[] args){
        String testFormat = "当前城市:${currentCity},今天天气:${weather},星期:${date}";
        String paramJson = "{\"currentCity\":\"合肥\",\"weather\":\"大雨\",\"date\":\"四\"}";
        Map map = JSON.parseObject(paramJson,Map.class);
        CharSegment seg = new CharSegment(testFormat);
        for(String key:seg.keys()){
            seg.set(key,map.get(key));
        }
        System.out.println(seg.toString());
    }

超好用

NutMap data=new NutMap();
data.put(".table", "table_1");
data.put("+*id", uuid);
dao.insert(data);
或者
dao.update(data);

社区棒!社区棒!社区棒!
文档全!文档全!文档全!

日志输出是有格式化的

private static final Log log = Logs.get();
log.infof("%s World!", "Hello");
log.errorf("%s Girl!", "Hello");

想打印详细错误日志?

log.errorf("详细错误信息:%s", Lang.getStackTrace(e));

计算365天后的时间?

System.out.println(Times.sDT(Times.nextDay(Times.now(), 365)));

随机生成个密码?

System.out.println(R.sg(12).next());

兽兽叔 威武

使用Json的to和from做父类强制转换成子类
Json.fromJson(子类.class, Json.toJson(父类实例));
配合fromJsonAsList可以转换数组或集合。

jar包size小,功能齐全,方便的一笔。

NutDao方面的,count,query,clear,fetchLink等这些都是炒鸡好用的,还有FileManager的原生SQL,每一样都完爆MyBatis。

API设计的精简易懂,不啰嗦

Times、Files、Http、Strings、Lang工具类,用过的人都说爽,码代码效率杠杠的溜。

添加回复
请先登陆
回到顶部