java8 函数式接口
文章目录
- java8 函数式接口
- 1. 函数式接口内的方法
- 2. 函数式接口定义
- 3. Supplier
- 4. Consumer
- 5. Function
- 6. Predicate
- 7. Optional
- 8. Reference
Functional Interface Name | Explain | Detailed description |
Supplier | 供给型接口 | 无参数, 返回一个结果 |
Consumer | 消费型接口 | 代表了接受一个输入参数并且无返回的操作 |
Function<T, R> | 函数型接口 | 接受一个输入参数, 返回一个结果 |
Predicate | 断定型接口 | 接受一个输入参数, 返回一个布尔值结果 |
1. 函数式接口内的方法
- 唯一的抽象方法(
函数式接口只有一个抽象方法
) - 使用 default 定义的普通方法(默认方法),通过对象调用。
实现接口后,因为默认方法不是抽象方法,所以可以不重写,但是如果开发需要,也可以重写 。当然如果接口中的默认方法不能满足某个实现类需要,那么实现类可以覆盖默认方法。签名跟接口default方法一致, 但是不能再加default修饰符。 - 使用 static 定义的静态方法,通过接口名调用。
2. 函数式接口定义
@FunctionalInterface
public interface CustomFunctional<T> {
void execute(T t);
@Override
boolean equals(Object obj);
default T submit(T t) {
return t;
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
3. Supplier
public static void main(String[] args) {
// 用于产生一个 100 的函数, 调用 get() 方法获取值
Supplier<Integer> supplier = () -> 100;
// 100
System.out.println(supplier.get());
}
4. Consumer
public static void main(String[] args) {
Consumer<String> first = (message) -> System.out.println("first " + message);
Consumer<String> second = (message) -> System.out.println("second " + message);
Consumer<String> consumer = first.andThen(second);
// first message
// second message
consumer.accept("message");
Consumer<String> consumer1 = second.andThen(first);
// second answerail
// first answerail
consumer1.accept("answerail");
}
5. Function
public static void main(String[] args) {
String[] arr = {"kobe", "jordan", "iverson", "james", "answer"};
Function<Integer, String> name = (index) -> arr[index];
// jordan
System.out.println(name.apply(1));
}
public static void main(String[] args) {
String[] arr = {"kobe", "answer", "iverson", "james", "jordan"};
HashMap<String, Integer> map = new HashMap<String, Integer>() {{
put("jordan", 1); put("kobe", 2); put("james", 3);
put("iverson", 4); put("answer", 5);
}};
Function<Integer, String> nameFunc = (index) -> arr[index];
Function<String, Integer> rankFunc = map::get;
// 给 nameFunc 传入参数 1, 并将其返回值作为 rankFunc 的传入参数
Integer rank = nameFunc.andThen(rankFunc).apply(1);
// rank: 5
System.out.println("rank: " + rank);
}
public static void main(String[] args) {
String[] arr = {"kobe", "answer", "iverson", "james", "jordan"};
HashMap<Double, Integer> map = new HashMap<Double, Integer>() {{
put(1.1, 4); put(1.2, 0); put(1.3, 2);
put(1.4, 3); put(1.5, 1);
}};
Function<Integer, String> nameFunc = (index) -> arr[index];
Function<Double, Integer> scoreFunc = map::get;
// 给 scoreFunc 传入参数 1.3 并将其结果作为 nameFunc 的传入参数
String name = nameFunc.compose(scoreFunc).apply(1.3);
// name: iverson
System.out.println("name: " + name);
}
public static void main(String[] args) {
// 传入参数即返回值, 即 传入啥返回啥
Function<String, String> function = Function.identity();
String name = function.apply("answerail");
// name: answerail
System.out.println("name: " + name);
}
6. Predicate
public static void main(String[] args) {
Predicate<Integer> min = (num) -> num > 5;
Predicate<Integer> max = (num) -> num < 10;
// min < num < max
Predicate<Integer> and = min.and(max);
// true
System.out.println(and.test(7));
// false
System.out.println(and.test(11));
// num > min || num < max
Predicate<Integer> or = min.or(max);
// true
System.out.println(or.test(11));
// !(num > min)
Predicate<Integer> negate = min.negate();
// false
System.out.println(negate.test(11));
}
7. Optional
public static void main(String[] args) {
Optional<String> optional = Optional.of("java8 optional by answerail.");
optional.isPresent();
String message = optional.get();
// message: java8 optional by answerail.
System.out.println("message: " + message);
String msg = optional.orElse("java8 optional by answerail at 20190410.");
// msg: java8 optional by answerail.
System.out.println("msg: " + msg);
Optional<String> opt = Optional.empty();
String str = opt.orElse("java8 optional by answerail at 20190410.");
// str: java8 optional by answerail at 20190410.
System.out.println("str: " + str);
// j
optional.ifPresent((s) -> System.out.println(s.charAt(0)));
}
8. Reference
- 接口Function、Consumer、Predicate、Supplier的使用