2021年8月20日

昨天的内容

生产者消费者模式

线程之间的数据共享用一个类来表示

这个类传给线程类的构造方法进行初始化

写两个类去实现Runnable接口,会变成两个线程

无外乎就是写这两个线程的wait方法notify方法

一定要记住一点,线程抢占式运行,你也不知道哪个线程先执行?

if-else语句运行的时候,通过不同的线程,执行的结果是不一样的!!!

反射:

通过.calss文件对象获取类下面的构造方法,属性,方法等对象的

1.获取Class对象,Hello.class文件当成一个对象

2.通过Class获取构造方法对象,获取属性对象,获取方法对象!!!

今天的内容

1.单例模式

2.lambda表达式

3.线上活动

4.安装mysql

5.进行一次一阶段考试

1.单例模式

java各种模式:是java的编程思想。前人给咱们总结了很多在写代码的时候一些规定好的写法。简单的写法。运行效率比较高的写法。设计模式

比如:单例模式 工厂模式,策略模式等。模式学起来要一辈子的事,不是这一节课就能搞定的,需要以后在开发中,不断的去优化咱们的代码。比如我这代码写的有冗余,能不能把它提出来使用工厂模式?可以的。不断的去优化,让设计模式达到最好的效果。以后咱们做了架构师以后,一般才有设计模式写代码。

咱们java学习的设计模式:

1.单例模式

2.工厂模式

3.代理模式(ssm框架里面)

要求在整个程序运行过程中,有且只有一个对象。

为什么要这样做?因为如果Person对象只需要实例化一次就可以了,不要其他的类下面去实例化了。节省咱们的内存空间。数据安全性和同步性。

new Person()

new Person()

你是如何创建一个对象:

new一个

问题:

通过构造方法和new的时候创建,都是不同的对象。

解决:

写一个限制,这个对象new过了,你不要再new了

第一个问题:

创建对象过于轻松,借助于构造方法和new就可以了

不让你这么简单,不让你这么轻松!!!目的不能随便的多new对象

解决:私有构造方法!!!

第二个问题:

类的外部不能在实例化对象了,加了private以后,在类外不能new了。

期望创建一个对象。怎么办?

对这个成员方法进行分析一下:

public修饰:类的外部需要调用这个方法

static修饰这个方法:是因为在外部没有对象调用这个方法!!!

package com.qfedu.a_single;

public class SingleDog {
//你new的对象赋值给了sd这个引用数据类型了
//为什么sd要用static修饰?静态方法中,只能使用静态属性,不能使用非静态成员属性
private static SingleDog sd = null;


//写一个私有化的无参数构造方法
//private修饰只能在本类中使用
//目的是不能在main主函数中直接new对象了。
private SingleDog() {

}
//成员方法,这个方法的目的,当对象有的话就直接获取,没有话,才进行new
//为啥是static的?是因为如果不是static的话,这个方法需要使用
//new 对象 对象.方法名字();
//类.方法名字()
public static SingleDog getInstance() {
//SingleDog.class ? 能不能用sd?不能
synchronized (SingleDog.class) {
//这个if判断很重要!!!是因为
if (sd == null) {
//如果sd是空,就意味着 SingleDog这个对是空的。
//线程1进到这个代码了。sd=null 需要new
//线程2也进到这个代码了,sd =null 需要new  
//那这两个对象就不一样了。一定保证线程安全。
sd = new SingleDog();
}
}

return sd;
}
}

手写单例模式

2.lambda表达式

就是一种的方式吗,开发的时候也有人用,但是很少!!!

lambda表达式可以不会写,但是得看懂!!!

先写个lambda表达式,让你们感受一下,然后再去看一下官方手册

个人特别不喜欢lambda表达式,因为可读性特别差。

但是在开发中有些喜欢写lambda表达式,和PHP特别像

lambda表达式的写法,在真实开发中一般是处理接口的!!!

https://www.runoob.com/java/java8-lambda-expressions.html

 

Lambda表达式

我们知道,对于一个Java变量,我们可以赋给其一个“值”

如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?

1

比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:

2

在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了

3

当然,这个并不是一个很简洁的写法。所以,为了使这个赋值操作更加elegant, 我们可以移除一些没用的声明。

4

这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式。但是这里仍然有一个问题,就是变量aBlockOfCode的类型应该是什么?在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。直接这样说可能还是有点让人困扰,我们继续看看例子。我们给上面的aBlockOfCode加上一个类型:

4

这种只有一个接口函数需要被实现的接口类型,我们叫它”函数式接口“。为了避免后来的人在这个接口中增加接口函数导致其有多个接口函数需要被实现,变成”非函数接口”,我们可以在这个上面加上一个声明@FunctionalInterface, 这样别人就无法在里面添加新的接口函数了:

5

这样,我们就得到了一个完整的Lambda表达式声明:

6

Lambda表达式有什么作用? 最直观的作用就是使得代码变得异常简洁。**

我们可以对比一下Lambda表达式和传统的Java对同一个接口的实现:

7

这两种写法本质上是等价的。但是显然,Java 8中的写法更加优雅简洁。并且,由于Lambda可以直接赋值给一个变量,我们就可以直接把Lambda作为参数传给函数, 而传统的Java必须有明确的接口实现的定义,初始化才行:

8

有些情况下,这个接口实现只需要用到一次。传统的Java 7必须要求你定义一个“污染环境”的接口实现MyInterfaceImpl,而相较之下Java 8的Lambda, 就显得干净很多。

Lambda结合FunctionalInterface Lib, forEach等新特性可以使代码变的更加简洁!

package com.qfedu.c_lam;

interface Myinterface {
   void doSomthing(String s);
}
public class Demo1 {
   public static void main(String[] args) {
       Myinterface a = (s)-> System.out.println(s);
       a.doSomthing("heheda");
       enact(s-> System.out.println(s), "hello world");
  }
   public static void enact(Myinterface myinterface, String s){
       myinterface.doSomthing(s);
  }

}



 

posted @ 2021-08-20 21:31  张三疯321  阅读(33)  评论(0)    收藏  举报