java8 filter方法、Predicate接口的使用方式
作者:chushiyunen
java8 filter方法、Predicate接口使用
filter方法在stream中起到过滤的作用,可以链式操作,不是terminal操作。
Predicate是一个接口,接口方法是test(),返回boolean值.
Predicate常和stream的filter配合使用,实现过滤。
可以多条件组合过滤,如代码:
public static void main(String[] args) { List<String> names = Arrays.asList("张三丰", "张翠山", "张无忌","金毛狮王","赵敏"); // 张开头的 Predicate<String> zhang=(n)->n.startsWith("张"); // // 含三丰的 Predicate<String> sanfeng=(n)->n.contains("三丰"); // 王结尾的 Predicate<String> wang=(n)->n.endsWith("王"); sanfeng.equals("金毛"); //Predicate常和stream的filter配合使用,实现过滤 //和filter结合用 默认调用的是test()方法 姓张的 names.stream().filter(zhang).forEach(n-> System.out.println(n)); //and() 姓张的,含三丰的 names.stream().filter(zhang.and(sanfeng)).forEach(n-> System.out.println(n)); //or() 张开头的,或者 王结尾的 names.stream().filter(zhang.or(wang)).forEach(n-> System.out.println(n)); //negate() 不是张开头的,但是王结尾的 names.stream().filter(zhang.negate().and(wang)).forEach(n-> System.out.println(n)); // equals() 方法还没懂什么意思 }
断言Predicate和过滤器(Filter)
Predicate断言又称谓词,用于条件判断,只有断言结果都为真,才会真正的执行路由。断言本质是定义路由转发的条件。
时间判断有三种:
- 1) AfterRoutePredicateFactory:判断请求日期是否晚于指定日期
- 2) BeforeRoutePredicateFactory:判断请求日期是否早于指定日期
- 3) BetweenRoutePredicateFactory:判断请求日期是否在指定时间段内
例:-After=2020-12-31T23:59:59.789+08:00[Asia/Shanghai]---表示在2020.12.31.之后可以进行访问
Method:表示请求方式,如果跟写的请求方式不同,那么就会判断false,从而不能访问成功。
过滤器(Filter)
过滤器(filter)就是在请求传递过程中,对请求和响应做一个处理,Gateway的Filter从作用范围可分为两种:GatewayFilter与GlobalFilter。
- (1)、GatewayFilter:应用在单个路由或者一个分组的路由上
- (2)、GlobalFilter:应用到所有的路由上。
配置的话写在配置文件中。在spring-cloud-gatewa下面。
限流设计
网关是所有外部请求的公共入口,所以可以在网关进行限流,而且限流方式有很多,我们采用sentinel组件来实现网关的限流。
进行限流设计:
1、添加依赖:
添加spring-cloud-starter-gateway spring-cloud-starter-alibaba-sentinel spring-cloud-alibaba-sentinel-gateway
2、添加sentinel和路由规则。
- 路由配置
routes: - id: route01 uri: lb://sca-provider predicates: ###匹配规则 - Path=/provider/echo/**
- sentinel配置
sentinel: transport: dashboard: localhost:8180 #Sentinel 控制台地址 eager: true #取消Sentinel控制台懒加载,即项目启动即连接
3、启动网关项目,检测sentinel控制台的网关菜单。
启动时,添加sentinel的jvm参数,通过此菜单可以让网关服务在sentinel控制台显示不一样的菜单,代码如下:
-Dcsp.sentinel.app.type=1
sentinel控制台启动后,界面是
4、在sentinel面板中设置限流策略。
前端排错:使用debugger是设置断点
练习/总结:
微服务架构下Ajax请求响应实践。
流程图如下:
首先是在一个网页里设置一个点击按钮,点击后发送Ajax访问请求,转给网关服务,然后再由网关转给服务类。服务类获取到参数,再转给网关,网关再传给网页,并将数据显示在网页中。
- 1、创建ui网页工程----先导入依赖spring-boot-stater-web依赖。
- 2、创建启动类
- 3、在resource文件夹下的创建一个HTML文件,使用Ajax请求,需要导入js文件。
js文件要在static目录下添加。如图
两种添加方式
cdn:---直接使用网上的js文件--网速好的话。
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
第二种:下载下来放到js文件夹下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div> <h2>The Index Page</h2> <button οnclick="doBuy()">Buy</button> <span id="result"></span> </div> <!-- <script src="https://unpkg.com/axios/dist/axios.min.js"></script> --> <script src="/js/axios.min.js"></script> <script> //前端如何排错(日志,debugger,排除) function doBuy(){ console.log("==doBuy=="); //1.基于axios框架发送异步ajax请求 let url="http://localhost:9000/nacos/provider/echo/1" let span=document.getElementById("result"); axios.get(url) .then(function (response) {//请求ok,执行then console.log(response.data); //2.将响应结果更新到页面上 span.innerHTML = response.data }) .catch(function (error) { debugger //设置断点 //console.log(error); if(error.response.status==429){ span.innerHTML = error.response.statusText; } }); } </script> </body> </html>
- 4、 在sca-gateway的配置文件中添加跨域设置
spring: cloud: gateway: globalcors: #跨域配置 cors-configurations: '[/**]': allowedOrigins: "*" allowedMethods: "*"
- 5、启动服务进行测试。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。