认识谓词Predicate
它是
Gateway
的路由的组成部分之一,是对条件匹配的判断,对判断来猜测,它要么是true
要么是false
。
# 认识 Predicate
由 Java8 引入,位于
java.util.function
包中,是一个FunctionalInterface
(函数式接口)
package java.util.function;
import java.util.Objects;
/**
* Represents a predicate (boolean-valued function) of one argument.
*
* <p>This is a <a href="package-summary.html">functional interface</a>
* whose functional method is {@link #test(Object)}.
*
* @param <T> the type of the input to the predicate
*
* @since 1.8
*/
@FunctionalInterface
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
test
方法,需要输入一个参数,且返回boolean
类型,通常是用在Steam
的filter
中,表示是否满足过滤条件。
既然是Java8
的函数式编程,我们写一个测试用例来进行简单的描述
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
/**
* java8 Predicate 使用方法与思想
* 断言 -> 判断
*/
@Slf4j
@SpringBootTest
@RunWith(SpringRunner.class)
public class PredicateTest {
public static List<String> MICRO_SERVICE = Arrays.asList(
"nacos", "authority", "gateway", "ribbon", "feign", "hystrix", "e-commerce"
);
/**
* test 方法主要用于参数符不符合规则,返回值是 boolean
*/
@Test
public void testPredicateTest() {
// 找到集合中每个字符串长度大于5的字符串进行过滤打印
Predicate<String> letterLengthLimit = s -> s.length() > 5;
MICRO_SERVICE.stream().filter(letterLengthLimit).forEach(System.out::println);
}
/**
* and 方法 等同于 逻辑与 && 且的意思,存在一个短路的特性,需要所有的条件都满足才可以
* 就是结合其他的 Predicate 进行一起判断
*/
@Test
public void testPredicateAnd() {
Predicate<String> letterLengthLimit = s -> s.length() > 5;
Predicate<String> letterStartWith = s -> s.startsWith("gate");
// 两个条件同时生效
MICRO_SERVICE.stream().filter(
letterLengthLimit.and(letterStartWith)
).forEach(System.out::println);
}
/**
* or 等同于 逻辑或 ||, 多个条件只要一个满足即可
*/
@Test
public void testPredicateOr() {
Predicate<String> letterLengthLimit = s -> s.length() > 5;
Predicate<String> letterStartWith = s -> s.startsWith("gate");
// 只要有一个条件通过即可
MICRO_SERVICE.stream().filter(
letterLengthLimit.or(letterStartWith)
).forEach(System.out::println);
}
/**
* negate 等同于 逻辑非 !,相反的意思
*/
@Test
public void testPredicateNegate() {
Predicate<String> letterStartWith = s -> s.startsWith("gate");
// 过滤不以 gate 开头的进行打印
MICRO_SERVICE.stream().filter(letterStartWith.negate()).forEach(System.out::println);
}
/**
* isEqual 类似于 equals()
* 区别:先判断对象是否为 null, 如果不为null再使用 equals方()法进行比较
*/
@Test
public void testPredicateIsEqual() {
Predicate<String> equalGateway = s -> Predicate.isEqual("gateway").test(s);
MICRO_SERVICE.stream().filter(equalGateway).forEach(System.out::println);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
Stream<T> filter(Predicate<? super T> predicate);
1
产生一个流,它包当前流中所有满足谓词(
Predicate
)条件的元素。
在 SpringCloud Gateway 中,可以根据谓词的特征,实现各种请求时的满足条件和判断。源码为PathRoutePredicateFactory.java
工厂类。其中主要是apply
方法是一个Predicate
返回类型。进而来实现匹配HTTP
请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
编辑 (opens new window)
上次更新: 2022/01/24, 22:22:24