java8 filter方法、Predicate接口的使用方式

 更新时间:2024年07月15日 10:13:27   作者:chushiyunen  
这篇文章主要介绍了java8 filter方法、Predicate接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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、启动服务进行测试。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于MyBatis结果映射的实例总结

    关于MyBatis结果映射的实例总结

    结果集映射主要是为了解决属性名和类型名不一致的问题,下面这篇文章主要给大家介绍了关于MyBatis结果映射的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Servlet中/和/*的区别详解

    Servlet中/和/*的区别详解

    本文将分析/和/*的区别这个老生常谈的问题,但是很多时候看完就忘了,关于此问题这一篇文章就够了,它将成为你的永久记忆,感兴趣的可以了解一下
    2021-07-07
  • Spring MVC拦截器和跨域请求使用详解

    Spring MVC拦截器和跨域请求使用详解

    SpringMVC的拦截器也是AOP思想的一种实现方式,主要用于拦截用户的请求并做相应的处理,通常应用在权限验证、记录请求信息的日志、判断用户是否登录等功能上,这篇文章主要介绍了Spring MVC拦截器和跨域请求,需要的朋友可以参考下
    2023-07-07
  • 解决java页面URL地址传输参数乱码的方法

    解决java页面URL地址传输参数乱码的方法

    这篇文章主要介绍了解决java页面URL地址传输参数乱码的方法,URL地址参数乱码问题,算是老话重谈了吧!需要的朋友可以参考下
    2015-09-09
  • Java编写实现九宫格应用

    Java编写实现九宫格应用

    这篇文章主要为大家详细介绍了Java编写实现九宫格应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java中的split使用方法详解

    Java中的split使用方法详解

    这篇文章主要介绍了Java中的split使用方法详解,Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,经过切割后得到的返回值是一个字符串数组,需要的朋友可以参考下
    2023-10-10
  • 基于Mock测试Spring MVC接口过程解析

    基于Mock测试Spring MVC接口过程解析

    这篇文章主要介绍了基于Mock测试Spring MVC接口过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Spring Cloud下实现用户鉴权的方案

    Spring Cloud下实现用户鉴权的方案

    Java下常用的安全框架主要有Spring Security和shiro,都可提供非常强大的功能,但学习成本较高。但在微服务下鉴权又会对服务有一定的入侵性。 因此,本文将介绍Spring Cloud下实现用户鉴权的方案,感兴趣的同学可以关注一下
    2021-11-11
  • 使用spring stream发送消息代码实例

    使用spring stream发送消息代码实例

    这篇文章主要介绍了使用spring stream发送消息代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况

    聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况

    这篇文章主要介绍了聊聊Spring循环依赖三级缓存是否可以减少为二级缓存的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论