文件上传优化
目的:解决文件名相同覆盖问题
1.文件名称进行优化
服务器端口传入文件名称一样,最终导致服务器硬盘只保留一个文件,所以需要对文件进行优化
//文件名称定义规则
0."beautiful"
1.把System.currentimients();毫秒值加入文件名
2.Random.nextInt(1000000),随机0~100万得数加入文件名
3.".jpg"
//前后加字符串是为了保证1 2 操作是拼接不是相加
2.如何保证服务器端一直处于文件接收状态
//使用循环
while(true){
Socket socket=serverSocket.accept();//表示来一个客户端我就接收
}
3.当多个客户端同时发送消息,我们就可以优化效率问题
方法:多线程,每个客户端单独一个线程,块就可以同时发生,不会因为等一个人另一个人不能动的情况
总体代码演示
注意
最终不能关闭服务器,关闭之后就不能实现一直保持服务器打开了
//serverSocket.close();这一步不能执行
函数式接口
1.概念
在java中,有且仅有一个抽象方法,就成为函数接口
2.适用场景:
函数式接口就是函数式编程,在Java中函数式编程体现在想起lambda表达式
函数式接口格式
接口中有且只有一个抽象方法,可以有其他的默认方法,静态方法,私有方法
@FunctionalInterface
函数式接口的是注解,表示是函数式接口,如果不是函数式接口这个注解报错
示例
函数式接口代码
函数式接口实现代码
函数式编程
在兼顾java面向对象的特性基础上,通过lambda编程方法引用,为开发者打开函数式编程的大门。
lambda表达式的延迟加载:提升一点点性能
有些场景代码运行后,结果不一定会被使用到从而造成性能的浪费,lambda表达式是延迟执行的,刚好解决这种性能浪费的场景。可以解决此问题
如果不使用lambda表达式,不管前面是否满足后面都会执行,使用了lambda表达式,如果前面的满足后面才执行,前面不满足后面的动都不会动。
代码演示
使用lambda表达式作为方法的参数和返回值
在java中,lambda表达式是作为匿名内部类的替代品,如果一个方法的参数是一个函数式接口类型,呢么可以使用lambda表达式进行替代
如果一个方法的返回值累类型是一个函数式接口:那么我们就可以直接用一个lambda表达式:Comparator是一个函数式接口(排序)
常用函数式接口
JDK官方提供了很多常用的函数式接口,就是为了丰富lambda表达式的使用场景,主要是在jav.util.function包下
Supplier(生产型接口)
- 在java.util.function.Supplier接口,只有一个get无参方法,用于获得泛型指定类型的对象数据,是一个函数式接口
- Supper
接口称为生产性接口,指定接口泛型类型,那么接口中的get方法就会产生什么类型的数据
代码演示
Cosumer接口(消费型接口)
- 在java.util.functiond.Consumer
,该接口刚好和supplier想法,不是用来生产一个市局的是拿来消费一个数据的。 - 数据类型由泛型来指定
- 抽象方法accept方法,意思就是消防一个指定泛型的数据
代码如下
onsumer的默认方法:andThen--->不能传null对象,不然就会有空指针异常
如果一个方法的参数和返回值都是Consumer类型,那么就可以实现这样的效果,消防数据的时候先做一个消费的操作,再做一个消防的操作。然后实现组合,就可以通过默认方法andThen来实现
代码演示
规则如果是con1连接con2那么就先执行con1再执行con2,所以至少需要传入两个Consumer接口对象,通过andThen执行消防动作。
练习
定义一个字符串数组存储每一个人的信息(姓名,年龄,地址)--->5个
需要使用Consumer接口按照指定的格式进行打印输出,姓名:张三;年龄:20;地址:郑州市,要求将打印姓名的动作作为第一个Consumer接口的规则,打印年龄作为第二个,打印地址的作为第三个
代码演示
Stream流:生产流水线
在JDK1.8中,由于lambda表达式这种函数式编程,JDK引入了一个全新概念,"Stream"流,用于解决已有集合类库的弊端
给集合数据
当我们需要数组元素操作的时候总是需要不停地循环遍历,很久烦死人。
我只想遍历一次就能实现效果