7.18实习培训日志-环境配置与设计模式

环境配置与设计模式

总结

今天早上主要去配置了IDEA,VScode等termimal端用git-bash,linux命令会好过cmd命令,然后对于IDEA有一些规范配置,如不要使用tab代替空格,import排序,字符集用utf-8,sonarlint,checkStyle等代码规范检查工具插件的安装,在idea上开了vpn下载插件下载一部分会断掉,因此我从idea官方插件库下载插件,然后本地安装。今天下午和晚上,主要学习软件设计模式和java8的一些新特性,如函数式编程,Lamda表达式,Stream。对于设计模式,很抽象,不懂他们的应用场景和具体的实现,而对于Lamda和Stream也只是了解其概念,对于其应用不太熟念,而且对于其原理也不了解。

IDEA Atom Vscode 环境配置

Idea Ternimal换成git bash

Idea setting搜索terminal,shell path改成D:\software\Git\bin\bash.exe

坑:我改成D:\software\Git\git-bash.exe,结果terminal弹出一个git-bash.exe,不在terminal窗口内显示git-bash.exe

VsCode Ternimal换成git bash

文件 —— 首选项 —— 用户设置:setting.json文件中设置

"terminal.integrated.shell.windows": "D:\\software\\Git\\bin\\bash.exe"

Atom 用的platformio-atom-ide-terminal的ternimal

找了很久,在文件->设置->核心设置->扩展包设置

platformio-atom-ide-terminal设置里面shell override改成"D:\software\Git\bin\bash.exe"

Idea搜索不了插件

settings-》system settings-》updates下面的use secure connection去掉勾 ==》无效

能是index过程中出问题,[File]->[Invalidate Caches] 清掉缓存 ==>无效

重启 ==》ok

Maven 更改jar包名

<build>
      <finalName>test</finalName>
</build>

Maven manifest加入Main-Class

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <mainClass>com.hand.App</mainClass>
        </manifest>
    </archive>
</configuration>

java基础开发规范

SonarLint,CheckStyle-IDEA插件,换行(\n),不要使用tab代替空格,import分组、排序规则

java基础开发规范

Git提交规范

  1. [IMP] 提升改善正在开发或已经实现的功能
  2. [FIX] 修正BUG
  3. [REF] 重构一个功能,对功能重写
  4. [ADD] 添加实现新功能
  5. [REM] 删除不需要的文件

Idea快捷键

Ctrl+T(改):查看子类
Ctrl+U:查看父类
Shift+Alt+N:全局搜索Task
Shift+Ctrl+Alt+N:symbol name:全局搜索类名
Alt+’:reformat code 格式化代码

Java即时编译

Java的即时编译(Just In Time, JIT)及其优化

Java基础知识

/ * * / 注释不能嵌套

0b或 0B:二进制数

Java7开始,可以为数字字面量加下划线,如1_000_000

千万不要使用未初始化的变量

if ( x = Double . NaN ) / / is never true
if ( Double . isNaN ( x ) ) / / check whether x is " not a number "
if ( x = 0 ) / /不能通过编译
int a;
System.out.println(a);//编译错误

在 Java 中可以将声明放在代码中的任何地方 。

double salary = 65000.0 ;
System.out.println(salary) ;
int vacationDays = 12 ; / / OK to declare a variable here

const 是Java保留的关键字,但目前并没有使用。在Java中,必须使用 final定义常量 。

如果在数值计算中不允许有任何舍入误差 ,应该使用 BigDecimal类

strictfp:所声明的范围内JAVA的编译器以及运行环境会完全依照浮点规范IEEE-754来执行。

设计模式

史上最全设计模式导学目录(完整版)

创建型模式

  1. 单例模式:私有化构造函数,私有化静态属性对象,公有化实例静态方法 缺点:扩展性受限,违背单一职责原则
  2. 工厂模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
  3. 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
  4. 建造者模式:使用多个简单的对象一步一步构建成一个复杂的对象。
  5. 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

结构型模式

  1. 适配器模式:适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
  2. 桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。
  3. 过滤器模式:使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。
  4. 组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  5. 装饰器模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。
  6. 外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
  7. 享元模式:享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。
  8. 代理模式:为其他对象提供一种代理以控制对这个对象的访问。

行为型模式

  1. 责任链模式:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  2. 命令模式:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
  3. 解释器模式:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。
  4. 迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
  5. 中介者模式:处理不同类之间的通信,并支持松耦合,使代码易于维护。
  6. 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  7. 观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
  8. 状态模式:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
  9. 空对象模式:创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。
  10. 策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
  11. 模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  12. 访问者模式:主要将数据结构与数据操作分离。

Java8新特性

Lamda

首先看一个简单例子

public static void main(String[] args) {
    List<String> lst = Arrays.asList("bb", "aa", "dd", "cc", "ee");
    // Lambda前
    for (String a : lst) {
        System.out.println(a);
    }
    // Lambda后
    lst.forEach(a -> System.out.println(a));
}

Iterable中源码如下

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。

函数式接口可以被隐式转换为lambda表达式。

public static void main(String[] args) {
    List<String> lst = Arrays.asList("bb", "aa", "dd", "cc", "ee");
    // Lambda前
    Collections.sort(lst, new Comparator<String>() {
        @Override
        public int compare(String o1, String o2) {
            return o1.compareTo(o2);
        }
    });
    // Lambda后
    Collections.sort(lst, (o1, o2) -> {
        return o1.compareTo(o2);
    });
}

lambda 表达式只能引用标记了 final 的外层局部变量,不能在 lambda 内部修改定义在域外的局部变量

隐性的具有 final 的语义:lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改

int num = 1;  
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2);
posted @ 2018-08-01 19:13  sufferingStriver  阅读(304)  评论(0编辑  收藏  举报