一些关于代码优化的踩坑经历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1782/article/details/78602834

记录一下自己的日常,日后发现新的会进行更新,想到什么写点什么,仅供自己日后查看。


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");


猜你喜欢

转载自blog.csdn.net/qq1782/article/details/78602834