A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 18032086639 于 2018-12-2 15:12 编辑


day12 函数式接口
自定义函数式接口
        @FunctionalInterface 注解
Lambda表达式:
        Lambda表达式的"延迟执行"的特点
        函数式接口作为方法的"参数"和"返回值类型"
常用函数式接口
        Supplier: 生产型函数式接口         获取值
        Consumer: 消费型函数式接口         使用值
        Predicate: 条件判断型函数式接口     判断值
        Function: 转换型函数式接口         转换值
##### 函数式接口概念, 自定义函数式接口
函数式接口: JDK 8 新特性
    有且仅有一个抽象方法的接口, 适用于函数式编程场景的接口
    (默认方法, 静态方法, 私有方法, 与 java.lang.Object 类中定义相同的抽象方法, 都不算作抽象方法)
自定义函数式接口:
        接口中有且只有一个抽象方法
@FunctionalInterface的作用:
        在接口上使用, 检测当前的接口是否为函数式接口
函数式接口的使用
函数式接口的使用:
        作为方法的参数类型, 传递Lambda表达式, 代替匿名内部类方式
性能浪费的日志案例
日志: 就是存储程序运行信息的文本文件.
    我们平时打印输出一些信息是在控制台上, 如果将这些信息写入文本文件, 这些文件就是日志
使用Lambda延迟执行的特性优化日志案例
Lambda具有"延迟执行"的特点:
        传递Lambda对象, 只有当符合执行条件时, 才会执行代码
        使用Lambda表达式作为方法参数
当一个方法的参数是一个函数式接口时, 可以使用Lambda表达式传递该参数, 简化匿名内部类的代码
使用Lambda表达式作为方法返回值
接口: 可以作为方法的参数类型, 还可以作为方法的返回值类型
当一个方法的返回值是一个函数式接口时, Lambda表达式方式是否比匿名内部类方式简单
当一个方法的返回值是一个函数式接口时, 可以返回Lambda表达式, 简化匿名内部类的代码
常用函数式接口
Java中提供的常用 函数式接口:
        Supplier<T>: 生产型函数式接口         获取值  a和b的和, 获取数组最大值, 获取一个Person对象
        Consumer<T>: 消费型函数式接口         使用值  给它一个String让他打印, 给它一个对象
        Predicate<T>: 条件判断型函数式接口     判断值  判断字符串长度是否大于5
        Function<T, R>: 转换型函数式接口      转换值  给它一个String转换为Integer "123"->123
Supplier生产型函数式接口
java.util.function.Supplier<T>函数式接口: 生产型函数式接口
        // 抽象方法
         T get(): 用于获取一个对象或值.
            至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现
Consumer消费型函数式接口
java.lang.StringBuilder类: 可变字符序列, 类似于String, 线程不安全效率高   
        StringBuilder reverse(): 将StringBuilder内部保存的内容反转
        String toString(): 转换为String
                new StringBuilder("abc").reverse().toString(); -> "cba" "abc" -> "cba"
java.lang.StringBuffer类: 可变字符序列, 类似于String, 线程安全效率低
        StringBuffer reverse(): 将StringBuffer内部保存的内容反转
        String toString(): 转换为String
java.util.function.Consumer<T>函数式接口: 消费型函数式接口
        // 抽象方法
        void accept(T t): 用于消费(使用)一个对象或值. 至于怎么消费, 要我们根据应用场景编写Lambda实现
        // 默认方法
        default Consumer<T> andThen(Consumer<? super T> after): 拼接两个Consumer接口的Lambda对象实现连续操作. 谁写前面, 谁先消费
Consumer消费型函数式接口: 默认方法andThen()
Consumer<T>接口中的默认方法 Consumer<T> andThen(Consumer<? super T> after) 如何简化多个Consumer的消费
Predicate条件判断函数式接口
java.util.function.Predicate<T>函数式接口: 条件接口, 用于判断
        // 抽象方法
        boolean test(T t): 判断参数传递的对象. 至于怎么判断, 判断什么, 需要我们编写Lambda表达式实现
        // 默认方法 (用于连接多个判断条件)
        default Predicate<T> and(Predicate<? super T> other): 与 &&
        default Predicate<T> or(Predicate<? super T> other): 或  ||
        default Predicate<T> negate(): 非, 取相反结果   !
boolean b = 判断方式1.or(判断方式2).and(判断方式3).negate().test("abc")
Predicate条件判断函数式接口: 默认方法and()
default Predicate<T> and(Predicate<? super T> other): 与
Predicate条件判断函数式接口: 默认方法or(), negate()
default Predicate<T> or(Predicate<? super T> other): 或
default Predicate<T> negate(): 非, 取相反结果
Function转换型函数式接口
函数 y = f(x)
java.util.function.Function<T,R>: 根据一个 T类型的数据 转换为 另一个R类型的数据
        T是 输入(input)的类型
        R是 返回结果(result)的类型
        有进有出, 所以称为"函数Function"
        // 抽象方法
        R apply(T t): 将T转换为R. 至于T和R是什么类型, 以及如何转换, 需要传递Lambda表达式实现
        // 默认方法
        default <V> Function<T, V> andThen(Function<? super R, ? extends V> after): 拼接多个Function转换
Function转换型函数式接口: 默认方法andThen()
今日Api
java.util.function.Supplier<T>函数式接口: 生产型函数式接口
        // 抽象方法
         T get(): 用于获取一个对象或值. 至于获取什么值, 怎么获取, 需要我们根据应用场景编写Lambda来实现
         
java.util.function.Consumer<T>函数式接口: 消费型函数式接口
        // 抽象方法
        void accept(T t): 用于消费(使用)一个对象或值. 至于怎么消费, 需要我们根据应用场景编写Lambda来实现
        // 默认方法
        default Consumer<T> andThen(Consumer<? super T> after): 拼接两个Consumer接口的Lambda对象实现连续操作. 谁写前面, 谁先消费
        
java.util.function.Predicate<T>函数式接口: 条件接口, 用于判断
        // 抽象方法
        boolean test(T t): 判断参数传递的对象. 至于怎么判断, 要判断什么, 需要我们编写Lambda表达式来实现
        // 默认方法 (用于连接多个判断条件)
        default Predicate<T> and(Predicate<? super T> other): 与
        default Predicate<T> or(Predicate<? super T> other): 或
        default Predicate<T> negate(): 非, 取相反结果
        
java.util.function.Function<T,R>: 根据一个T类型的数据得到另一个R类型的数据
        T称为前置条件, 也就是输入(input)的类型
        R称为后置条件, 也就是返回结果(result)的类型
        有进有出, 所以称为"函数Function"
        // 抽象方法
        R apply(T t): 将T转换为R
        // 默认方法
        default <V> Function<T, V> andThen(Function<? super R, ? extends V> after): 拼接多个Function转换
day11 网络编程
软件结构介绍
C/S结构:
        全称为Client/Server结构, 是指 客户端 和 服务器 结构
        常见程序有QQ, 迅雷等软件
B/S结构:
        全称为Browser/Server结构, 是指 浏览器 和 服务器 结构
        常见浏览器有IE, 谷歌, 火狐等
        
网络编程: 在一定的"协议"下, 实现两台计算机的通信的程序
中国人  ---翻译--->  美国
中国人学英语  ----> 美国人
计算机A  ------> 计算机B  
网络通信协议
网络通信协议:
        通信协议是计算机必须遵守的规则, 只有遵守这些规则, 计算机之间才能进行通信.
        协议中对数据的传输格式, 传输速率, 传输步骤等做了统一规定, 通信双方必须同时遵守, 最终完成数据交换
        (类似于一种语言, 语法语速做了规定)
TCP/IP协议:
        Transmission Control Protocol/Internet Protocol, 传输控制协议/因特网互联协议.
        它定义了计算机如何连入因特网, 以及数据如何在它们之间传输的标准. 它的内部包含一系列的用于处理数据通信的协议, 并采用了4层的分层模型, 每一层都呼叫它的下一层所提供的协议来完成自己的需求
网络通信协议分类
UDP: User Datagram Protocol, 用户数据报协议
        特点:
                1. 无连接的不可靠协议
                2. 数据按包发送, 64K一个包
                3. 速度快效率高, 容易丢包
        用于视频直播, 网络电话
TCP: Transmission Control Protocol, 传输控制协议
        特点:
                1. 需要建立连接的可靠协议  电话
                2. 数据传输无大小限制
                3. 速度慢效率低   重发机制
        用于文件下载, 浏览网页
        
TCP通信的三次握手: TCP协议中, 在发送数据的准备阶段, 客户端与服务器之间的三次交互, 以保证连接的可
        1. 客户端向服务端发送验证信息, 等待服务器确认
服务端收到验证信息后, 回复客户端验证信息, 同时发送自己的一条验证信息
客户端收到服务端回复的信息, 确认自己之前发的信息无误, 并再次向服务器发回服务端的验证信息
网络编程三要素: IP地址
网络编程三要素:
        1. 通信协议  TCP
        2. IP地址
        3. 端口号
               
IP地址: 互联网协议地址(Internet Protocol Address). 是网络中计算机的唯一标识
        版本:
                IPv4: 192.168.1.2
                IPv6: ABCD:EF01:2345:6789:ABCD:EF01:2345:6789
        特殊的IP地址: "127.0.0.1", "localhost", 都代表自己的电脑
常用DOS命令:
        // 查看自己电脑的IP地址
        ipconfig
        // 查看是否能连接到指定IP地址
        ping IP地址
        ping 192.168.31.2
网络三要素: 端口号
端口号: 计算机中进程的唯一标识
        端口号的取值范围: 0~65535的整数, 其中0~1024不建议使用
        
注意:
        通信的两端是2个计算机中的2个程序在相互通信, 所以2个程序都要有端口号. 端口号可以相同, 也可以不同, 相互之间能识别就行        
TCP通信程序概述(上)
java.net.ServerSocket类: TCP服务端
        // 构造方法
        ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
        // 成员方法
        Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
        void close(): 关闭服务端ServerSocket
java.net.Socket类: TCP客户端
        // 构造方法
        Socket(String ip, int port): 创建TCP客户端对象
        // 成员方法
        OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
        InputStream getInputStream(): 获取输入流, 用于接收数据
        void shutdownOutput(): 关闭输出流, 发送结束标记
        void close(): 关闭客户端Socket
TCP严格区分为 客户端(Client) 与 服务端(Server)
两端通信时步骤:
        1. 服务端程序需要先启动, 等待客户端的连接
        2. 客户端主动连接服务器端, 连接成功才能通信. 服务端不可以主动连接客户端
两端之间以 "IO字节流" 进行通信
一个服务端可以和多个客户端同时通信
TCP通信方式概述(下)
服务端(ServerSocket)可以通过 accept() 方法等待一个客户端(Socket)主动连接, 从而得到一个客户端对象(Socket), 来识别不同的客户端
服务端(ServerSocket)没有IO流, 是通过获取到"每个客户端对象(Socket)的IO流对象"来进行通信的.
        使用"客户端的InputStream"读取客户端发来的数据
        使用"客户端的OutputStream"向客户端回写数据
TCP程序: 客户端代码实现
java.net.Socket类: TCP客户端
        // 构造方法
        Socket(String 服务端ip, int 服务端port): 创建TCP客户端对象, 同时尝试连接到指定的服务端
                (客户端也会获取系统随机分配的一个端口号)
        // 成员方法
        OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
        InputStream getInputStream(): 获取输入流, 用于接收数据
        void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕, 结束标记-1
        void close(): 关闭客户端Socket, 告知服务端数据发送完毕
        
实现步骤:
        1.创建一个客户端对象 Socket, 构造方法传入服务器的IP地址和端口号
        2.使用Socket对象中的方法 getOutputStream() 获取网络字节输出流OutputStream对象
        3.使用网络字节输出流OutputStream对象中的方法 write(), 给服务器发送数据
        4.使用Socket对象中的方法 getInputStream() 获取网络字节输入流InputStream对象
        5.使用网络字节输入流InputStream对象中的方法 read(), 读取服务器回写的数据
        6.释放资源(Socket)
        
注意:
        1.客户端和服务器端进行交互, 必须使用Socket中提供的网络流, 不能使用自己创建的流对象
        2.当我们创建客户端对象Socket的时候, 就会去请求服务器和服务器经过3次握手建立连接通路
                这时如果服务器没有启动, 那么就会抛出异常ConnectException: Connection refused: connect
                如果服务器已经启动, 那么就可以进行交互了// 创建客户端Socket对象, 指定要连接的服务端的IP和端        口号
        Socket socket = new Socket("127.0.0.1", 8888);
        // 向服务端发送数据
        OutputStream os = socket.getOutputStream();
        os.write("你好服务器".getBytes());
        // 释放资源
        socket.close();
TCP程序: 服务器端代码实现
java.net.ServerSocket类: TCP服务端
        // 构造方法
        ServerSocket(int 服务端自己用的port): 创建一个TCP服务端, 并监听指定端口
        // 成员方法
        Socket accept(): 等待客户端连接, 会阻塞. 客户端连接后返回客户端的Socket对象
        void close(): 关闭服务端ServerSocket, 断开所有流
        
服务器的实现步骤:
        1.创建服务器ServerSocket对象并指定服务器占用的端口号
        2.使用ServerSocket对象中的方法 accept(), 获取到请求的客户端对象Socket
        3.使用Socket对象中的方法 getInputStream() 获取网络字节输入流InputStream对象
        4.使用网络字节输入流InputStream对象中的方法 read(), 读取客户端发送的数据
        5.使用Socket对象中的方法 getOutputStream() 获取网络字节输出流OutputStream对象
        6.使用网络字节输出流OutputStream对象中的方法 write(), 给客户端回写数据
        7.释放资源(Socket,ServerSocket)
        java.net.ServerSocket类: TCP服务端
        // 构造方法
        ServerSocket(int 服务端自己用的port): 创建一个TCP服务端, 并监听指定端口
        // 成员方法
        Socket accept(): 等待客户端连接, 会阻塞. 客户端连接后返回客户端的Socket对象
        void close(): 关闭服务端ServerSocket, 断开所有流
        
服务器的实现步骤:
        1.创建服务器ServerSocket对象并指定服务器占用的端口号
        2.使用ServerSocket对象中的方法 accept(), 获取到请求的客户端对象Socket
        3.使用Socket对象中的方法 getInputStream() 获取网络字节输入流InputStream对象
        4.使用网络字节输入流InputStream对象中的方法 read(), 读取客户端发送的数据
        5.使用Socket对象中的方法 getOutputStream() 获取网络字节输出流OutputStream对象
        6.使用网络字节输出流OutputStream对象中的方法 write(), 给客户端回写数据
        7.释放资源(Socket,ServerSocket)
// 创建服务端ServerSocket对象, 并指定自己监听的端口
ServerSocket server = new ServerSocket(8888);
// 调用accept方法等待客户端连接
Socket socket = server.accept();
// 通过客户端获取输入流, 读取客户端发来的数据
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
int len = is.read(bytes);
System.out.println(new String(bytes, 0, len));
// 通过客户端获取输出流, 向客户端回写数据
OutputStream os = socket.getOutputStream();
os.write("收到谢谢".getBytes());
// 释放资源
socket.close();
// server.close();  // 客户端一般不关闭
今日API
java.net.ServerSocket类: TCP服务端
        // 构造方法
        ServerSocket(int port): 创建一个TCP服务端, 并监听指定端口
        // 成员方法
        Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
        void close(): 关闭服务端ServerSocket
java.net.Socket类: TCP客户端
        // 构造方法
        Socket(String ip, int port): 创建TCP客户端对象
        // 成员方法
        OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
        InputStream getInputStream(): 获取输入流, 用于接收数据
        void shutdownOutput(): 关闭输出流, 告知服务端数据发送完毕
        void close(): 关闭客户端Socket



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马