记录一下自己的日常,日后发现新的会进行更新,想到什么写点什么,仅供自己日后查看。
1.即使是主键查询,当涉及到大字段(text)时,也会很严重的影响性能。(Mybatis利用Generator生成的selectByPrimaryKey的查询熟读很慢,后来把表里面的大字段不查了以后变快了很多)
2.不要重复的执行一个数据库查询,即使有数据库缓存的情况也应该避免,而且如果代码有2次或者以上取出所有数据的操作应该改写成1次,尽量重用。(例如:频繁的数据库查询同一张表 看看查询的内容是否具备重用合并的可能性)
3.尽量减少对变量的重复计算(对于for循环而言有时候foreach是不错的选择)
例如:
for (int i = 0; i < list.size(); i++) 和
for (int i = 0, int length = list.size(); i < length; i++)
4.字符串变量和字符串常量equals的时候将字符串常量写在前面,这样可以避免空指针。(例如“SUCCESS”.equals)
5.懒加载策略,尽量重用对象(例如:String/StringBuilder/StringBuffer的不同和区别
6.No Magic Vlaue(不允许任何未经预定义的常量直接出现在代码中)。(例如:https://p3c.alibaba.com/plugin/eclipse/update 在这个链接里面安装好阿里巴巴发布的规范化插件之后 其实还有一本纪念版的pdf 之后扫描了一下自己的代码 最广泛的就是这种错误了)
7.Java8的Lambda表达式一定要熟练应用,因为可以省很多事情,还有Java8里面的@FunctionalInterface有时候使用好了能够大大的简化开发。(例如:如果我们要计算一个list里面所有Integer的和 计算个数是偶数的和 计算。。等等,如果传进去一个Predicate的话,可以节省很多代码)再例如下面的代码
Collections. sort( inventory, new Comparator<Apple> ( ) {
public int compare(Apple a1, Apple a2){
return a1.getWeight() .compareTo(a2.getWeight() ) ;
}
改写成下面的代码:
inventory. sort(comparing(Apple: :getWeight) ) ; 又省空间又好看。
顺带介绍一下功能函数吧:
1.Function(功能):
Fcuntion接口是对接受一个T类型参数,返回R类型的结果的方法的抽象,通过调用apply方法执行内容。
@FunctionalInterface
public interface Function<T, R>
例子:
Function<Integer, Integer> actFunction = x -> x + 1;
System.err.println(actFunction.apply(1));
2.Predicate 接口
Represents a predicate (boolean-valued function) of one argument.
predicate 谓语接口,顾名思义,中文中的‘是’与‘不是’是中文语法的谓语,同样的该接口对应的方法为接收一个参数,返回一个Boolean类型值,多用于判断与过滤,当然你可以把他理解成特殊的Funcation,但是为了便于区分语义,还是单独的划了一个接口,使用test()方法执行这段行为
public static void main(String[] args) {
Predicate<Integer> predOdd = integer -> integer % 2 == 1;
System.out.println(predOdd.test(5));
//控制台输出 5
}
3. Supplier 接口
* Represents a supplier of results.
* There is no requirement that a new or distinct result be returned each
* time the supplier is invoked.
Supplier 接口翻译过来就是提供者,消费者相反,该接口对应的方法类型为不接受参数,但是提供一个返回值,通俗的理解为这种接口是无私的奉献者,不仅不要参数,还返回一个值,使用get()方法获得这个返回值
Supplier<?> supplier = () -> "hello";
System.err.println(supplier.get());
4.Consumer 接口
Consumer 接口翻译过来就是消费者,顾名思义,该接口对应的方法类型为接收一个参数,没有返回值,可以通俗的理解成将这个参数'消费掉了',一般来说使用Consumer接口往往伴随着一些期望状态的改变或者事件的发生,例如最典型的forEach就是使用的Consumer接口,虽然没有任何的返回值,但是却向控制台输出了语句。
Consumer<String> consumer=x->System.err.println(x.toUpperCase());
consumer.accept("sghduhdi812fffsssSSS");