网络编程
C/S结构,B/S结构。TCP/IP传输控制协议/网络协议(面向连接,三次握手,无差错传输)。UDP用户数据报协议(无连接,发送端不确认接收端是否存在,64kb限制)。
IPv4地址(42亿个,每个4字节),IPv6地址(每个16字节)。网络软件打开后,由操作系统分配端口号(两个字节0-65535,1024之前的端口号已被分配)。
端口号使得数据能够正确发送到指定位置,80网络端口,3306mysql端口,oracle1521端口,tomcat端口8080.
客户端请求服务器端,建立连接IO对象,使用IO对象(网络字节流对象)进行通信。对应的类为Socket类(客户端),ServerSocket类(服务器端)。
服务器端(没有IO流)的accept方法,获取请求的客户端对象Socket。使用获取的对应客户端的Socket与该客户端交互。
Socket类,套接字(IP和端口号)。其构造方法Socket传入套接字,使用getOutputStream方法返回输出流,使用getInputStream方法返回输入流,close关闭。
客户端:getOutputStream的write方法给服务器发送数据,getInputStream的read方法读取服务器返回数据。
服务端:ServerSocket类,构造方法传入端口号建立对象,accept方法获取客户端的Socket,使用Socket的方法(与客户端相同),进行读写数据。完毕后释放客户端Socket和服务端(close)。
读写方法方式以IO流方法,即可。
BS、CS网络通信
文件上传,结合了文件输入输出流和网络输入输出流。文件的上传等需要注意阻塞状态(因读写文件,发送端没有发送结束标记,需要在上传完毕后写入shutdownOutput方法结束标记)
文件上传名,防止重复问题,使得命名添加当前毫秒值+随机数。服务器端使用死循环和多线程技术,使得客户端访问更流畅。
创建BS模式,服务器需要读取客户端的请求信息后,解析(使用BufferedReader的readLine方法读取一行,使用String的split方法获取路径信息,然后输出HTTP响应头,之后输出文件)
需要开启多线程(适应浏览器的多线程请求资源),并写死循环。
函数式接口
函数式接口,有且只有一个抽象方法的接口,使用lambda表达式实现。语法糖表示原理不变,使用更加方便的语法格式。
注解@FunctionalInterface,用于检测接口是否是函数式接口。
lambda表达式有延迟加载的特点,针对目标函数参数传入lambda格式,将所有参数代入目标函数中,若不符合条件,则不会处理lambda中定义的内容,
即lambda的延迟处理,使得诸如拼接字符串等性能消耗较大的句子在不符合条件过程中直接不执行。
lambda表达式()->{},中,括号的参数类型可省略,单参数括号可省略,花括号的return关键字,分号,和花括号在一行时候可省略。
lambda不仅在其他函数调用传入参数时候使用,也可以在其他函数内部返回值时候使用(返回值已经推测为函数式接口)。
Supplier、Consumer
Supplier函数式接口,包含一个泛型<T>,返回指定类型泛型的数据类型。为生产型接口。其get方法,用于返回泛型类型的对应数据类型。
使用时使用lambda重写其get方法。
Consumer函数式接口,指定一个泛型,使用该泛型处理数据。为消费型接口,重写其accept方法,用于自定义处理泛型对应类型的数据。
StringBuffer的reverse方法加toString方法,可以翻转字符串。
Consumer的andThen默认方法,将两个Consumer接口组合到一起,然后再使用accept进行消费。格式如:con1.andThen(con2).accept,将con1和con2连续消费。
Consumer的消费可以用于信息格式化输出。accept使用多个lambda重写,使得Consumer的对象在con1.andThen(con2).accept下能够连续被处理。
Predicate、Function
其中的默认方法and,or,negate(取反)。用于连接判断条件。使用格式如pre1.and(pre2).test。等价于pre1.test() && pre2.test()。等等。
Predicate可以用于信息的筛选。
其中也有andThen默认方法,进行组合操作。重写apply方法,进行类型转换和其他数据处理运算等操作。
Stream流
Stream流,对集合和数组进行简化操作(转化为流进行操作)。集合Collection(单列)(及其子类)使用stream方法将其转化为流。也可以使用Stream的静态方法of获取stream对象。
流水线式的操作,filter过滤,map数据映射,skip跳过等,按需计算,在count执行之后,其它操作才按策略执行处理。每次处理会获取一个新的流。
每个Stream使用完毕后会关闭,不能再调用方法(但是重新生成新的Stream流)。
Stream的延迟方法,返回其Stream接口本身,可以链式调用。终结方法,不返回本身,不能继续链式调用。
流中的filter方法,传入lambda表达式进行数据过滤(lambda重写了Predicate的函数式接口)
forEach方法,传入lambda表达式进行遍历输出操作(forEach传入的lambda重写了Consumer的函数式接口)。
map方法,传入lambda重写Function的函数式接口,实现将数据格式进行转换等。
count方法,终结类方法,用于统计Stream流中的元素个数。直接调用即可。
limit方法,延迟类方法,对流中的元素进行截取并返回。传入个数即可。
skip方法,跳过前n个元素,截取流中后面的元素。传入个数即可。
concat静态方法,将两个流合并为1个流。格式如:Stream.concat(st1,st2)。
方法引用
方法引用(:: 双冒号),优化lambda表达式。lambda的内容对象名和成员方法存在,可以使用方法引用代替,格式如:s->{System.out.println(s)}变为System.out::println。
通过自定义的对象名引用方法。也可以通过类名引用静态方法。通过super关键字,方法引用父类的成员方法。通过this关键字,方法引用本类的成员方法。
构造器(构造方法)引用,使用new关键字,格式如:Person::new。根据传递的参数创建对象(间接调用构造方法)。
数组引用,格式如:int[]::new,创建并传入了一个数组引用来代替lambda的new int[]