组成:
-1.一些参数 -2.一个箭头 -3.一段代码
格式:
(参数类型 参数名称) -> { 代码语句 }
//说明
- 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
- `->`是新引入的语法格式,代表指向动作。
- 大括号内的语法与传统方法体要求基本一致。
省略规则:
1. 小括号内参数的类型可以省略; 2. 如果小括号内**有且仅有一个参**,则小括号可以省略; 3. 如果大括号内**有且仅有一个语句**,则无论是否有返回值,都可以省略大括号、return关键字及语句分号。
使用前提:
1. 使用Lambda必须具有接口,且要求**接口中有且仅有一个抽象方法**。 无论是JDK内置的`Runnable`、`Comparator`接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。 2. 使用Lambda必须具有**上下文推断**。 也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例
tips:有且仅有一个抽象方法的接口,称为“函数式接口”。
Stream流例子说明lambda流
public class Demo03StreamFilter {
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.stream()
.filter(s -> s.startsWith("张"))
.filter(s -> s.length() == 3)
.forEach(System.out::println);
}
}
流获取方式
1.List Listlist = new ArrayList<>(); Stream stream1 = list.stream(); 2.Set Set set = new HashSet<>(); Stream stream2 = set.stream(); 3.Vector Vector vector = new Vector<>(); Stream stream3 = vector.stream(); 4.Map Map map = new HashMap<>(); Stream keyStream = map.keySet().stream(); Stream valueStream = map.values().stream(); Stream > entryStream = map.entrySet().stream(); 5.数组流 Stream stream = Stream.of(array);
常用API
| 方法名 | 方法作用 | 方法种类 | 是否支持链式调用 |
|---|---|---|---|
| count | 统计个数 | 终结 | 否 |
| forEach | 逐一处理 | 终结 | 否 |
| filter | 过滤 | 函数拼接 | 是 |
| limit | 取用前几个 | 函数拼接 | 是 |
| skip | 跳过前几个 | 函数拼接 | 是 |
| map | 映射 | 函数拼接 | 是 |
| concat | 组合 | 函数拼接 | 是 |
| Object[] toArray(); | 把结果放到数组中 |
构造方法:
- `public File(String pathname) ` :通过将给定的**路径名字符串**转换为抽象路径名来创建新的 File实例。 - `public File(String parent, String child) ` :从**父路径名字符串和子路径名字符串**创建新的 File实例。 - `public File(File parent, String child)` :从**父抽象路径名和子路径名字符串**创建新的 File实例。
常用API:
public String getAbsolutePath() :返回此File的绝对路径名字符串。 public String getPath() :将此File转换为路径名字符串。 public String getName() :返回由此File表示的文件或目录的名称。 public long length() :返回由此File表示的文件的长度。 public boolean exists() :此File表示的文件或目录是否实际存在。 public boolean isDirectory() :此File表示的是否为目录。 public boolean isFile() :此File表示的是否为文件。 public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 public boolean delete() :删除由此File表示的文件或目录。 public boolean mkdir() :创建由此File表示的目录。 public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。 public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。 public File[] listFiles():返回一个File数组,表示该File目录中的所有的子文件或目录。三、IO流
| 类型 | 输入流 | 输出流 |
|---|---|---|
| 字节流 | InputStream | OutputStream |
| FileInputStream | FileOutputStream | |
| BufferedInputStream | BufferOutputStream | |
| 对象持久化流 | ObjectInputStream | ObjectOutputStream |
| 字符流 | Reader | Writer |
| FileReader | FileWriter | |
| BufferedReader | BufferedWriter | |
| 转换流(字符流子类) | InputStreamReade | OutputStreamReader |
序列化
- 一个对象要想序列化,必须满足两个条件:
- 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
- 该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用**transient** 关键字修饰。
自动关闭资源对象
格式:
try (创建流对象语句,多个,使用';'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
四、 Properties类
构造方法:
public Properties()
常用API:
- `public Object setProperty(String key, String value)` : 保存一对属性。 - `public String getProperty(String key) ` :使用此属性列表中指定的键搜索属性值。 - `public SetstringPropertyNames() ` :所有键的名称的集合。
流:
`public void load(InputStream inStream)`: 从字节输入流中读取键值对。五、打印流 PrintStream类
构造方法:
public PrintStream(String fileName)
例子:
PrintStream ps = new PrintStream("ps.txt");
// 设置系统的打印流流向,输出到ps.txt
System.setOut(ps);
网络编程 一、通信协议 分类:
-
TCP:
面向连接,传输可靠,三次握手
TCP协议的特点
* 面向连接的协议
* 只能由客户端主动发送数据给服务器端,服务器端接收到数据之后,可以给客户端响应数据。
* 通过三次握手建立连接,连接成功形成数据传输通道。
* 通过四次挥手断开连接
* 基于IO流进行数据传输
* 传输数据大小没有限制
* 因为面向连接的协议,速度慢,但是是可靠的协议。
TCP协议的使用场景
* 文件上传和下载
* 邮件发送和接收
* 远程登录
TCP协议相关的类
* Socket
* 一个该类的对象就代表一个客户端程序。
* ServerSocket
* 一个该类的对象就代表一个服务器端程序。
Socket类构造方法
* Socket(String host, int port)
* 根据ip地址字符串和端口号创建客户端Socket对象
* 注意事项:只要执行该方法,就会立即连接指定的服务器程序,如果连接不成功,则会抛出异常。
如果连接成功,则表示三次握手通过。
Socket类常用方法
* OutputStream getOutputStream(); 获得字节输出流对象
* InputStream getInputStream();获得字节输入流对象
-
IP:
面向无连接,直接发送数据,传输速度快,但是容易丢失数据 -
UDP:
UDP协议的特点
* 面向无连接的协议
* 发送端只管发送,不确认对方是否能收到。
* 基于数据包进行数据传输。
* 发送数据的大小限制64K以内
* 因为面向无连接,速度快,但是不可靠。
UDP协议的使用场景
* 即时通讯
* 在线视频
* 网络语音电话
UDP协议相关的两个类
* DatagramPacket
* 数据包对象
* 作用:用来封装要发送或要接收的数据,比如:集装箱
* DategramSocket
* 发送对象
* 作用:用来发送或接收数据包,比如:码头
DatagramPacket类构造方法
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
* 创建发送端数据包对象
* buf:要发送的内容,字节数组
* length:要发送内容的长度,单位是字节
* address:接收端的IP地址对象
* port:接收端的端口号
* DatagramPacket(byte[] buf, int length)
* 创建接收端的数据包对象
* buf:用来存储接收到内容
* length:能够接收内容的长度
DatagramPacket类常用方法
* int getLength() 获得实际接收到的字节个数
DatagramSocket类构造方法
* DatagramSocket() 创建发送端的Socket对象,系统会随机分配一个端口号。
* DatagramSocket(int port) 创建接收端的Socket对象并指定端口号
DatagramSocket类成员方法
* void send(DatagramPacket dp) 发送数据包
* void receive(DatagramPacket p) 接收数据包
NIO(非阻塞同步)
组成:Channel、Buffer、Selector
1. Channel:
Channel是一个对象,可以通过它读取和写入数据
* Channel是双向的,既可以读又可以写 * Channel可以进行异步的读写 * 对Channel的读写必须通过buffer对象
Channel类型:
* FileChannel:从文件读取数据的 * DatagramChannel:读写UDP网络协议数据 * SocketChannel:读写TCP网络协议数据 * ServerSocketChannel:可以监听TCP连接
2.Buffer
Channel读取数据到Buffer中
使用buffer的步骤:
1.写入数据到 Buffer; 2.调用 flip() 方法; 3.从 Buffer 中读取数据; 4.调用 clear() 方法或者 compact() 方法。
Buffer类型:
* ByteBuffer * CharBuffer * DoubleBuffer * FloatBuffer * IntBuffer * LongBuffer * ShortBuffer
3.Selector
Selector,可以用一个线程来处理所有的channel
创建Selector:
Selector selector = Selector.open();
注册Channel到Selector:
channel.configureBlocking(false); //SelectionKey 代表这个通道在此 Selector 上注册 还可以用于取消通道的注册 SelectionKey key =channel.register(selector,SelectionKey.OP_READ);



