Java8函数式接口Function、Consumer、Predicate、Supplier
1. java8中函数接口的种类:
2. function型函数式接口
Function接口 接受一个输入参数T,返回一个结果R。
function的源码
@FunctionalInterface
public interface Function<T, R> {
// 接受输入参数,对输入执行所需操作后 返回一个结果。
R apply(T t);
// 返回一个 先执行before函数对象apply方法,再执行当前函数对象apply方法的 函数对象。
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
// 返回一个 先执行当前函数对象apply方法, 再执行after函数对象apply方法的 函数对象。
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
// 返回一个执行了apply()方法之后只会返回输入参数的函数对象。
static <T> Function<T, T> identity() {
return t -> t;
}
示例:
static int modifyTheValue(int valueTobeOperated, Function<Integer, Integer> function) {
return function.apply(valueTobeOperated);
}
int myNumber = 10;
// 使用lambda表达式实现函数式接口
// (x)->(x)+20 输入一个参数x,进行加法运算,返回一个结果
// 所以该lambda表达式可以实现Function接口
int resl = modifyTheValue(myNumber, (x) -> x + 20);
System.out.println(resl);
//使用匿名内部类
int res2 = modifyTheValue(myNumber, new Function<Integer, Integer>() {
@Override
public Integer apply(Integer integer) {
return integer + 20;
}
});
System.out.println(res2);
3. Consumer 函数式接口
接受一个输入参数并且无返回的操作
static void modifyTheValue3(int value, Consumer<Integer> consumer) {
consumer.accept(value);
}
@Test
public void consumerTest()
{
// (x) -> System.out.println(x * 2)接受一个输入参数x
// 直接输出,并没有返回结果
// 所以该lambda表达式可以实现Consumer接口
modifyTheValue3(3, (x) -> System.out.println(x * 2));
}
}
4.Predicate函数式接口
接受一个输入参数,返回一个布尔值结果。
public static boolean predicateTest(int value, Predicate<Integer> predicate) {
return predicate.test(value);
}
@Test
public void prdTest() {
// (x) -> x == 3 输入一个参数x,进行比较操作,返回一个布尔值
// 所以该lambda表达式可以实现Predicate接口
System.out.println(predicateTest(3, x -> x == 3));
}
public static void eval(List<Integer> list, Predicate<Integer> predicate) {
for (Integer n : list) {
if (predicate.test(n)) {
System.out.print(n + " ");
}
}
}
@Test
public void predtest2() {
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// Predicate<Integer> predicate = n -> true
// n 是一个参数传递到 Predicate 接口的 test 方法
// n 如果存在则 test 方法返回 true
System.out.println("输出所有值:");
eval(list, n -> true);
// Predicate<Integer> predicate2 = n -> n > 3
// n 是一个参数传递到 Predicate 接口的 test 方法
// 如果 n 大于 3 test 方法返回 true
System.out.println("\n输出大于 3 的所有数字:");
eval(list, n -> n > 3);
}
5. Supplier供给型函数式接口
无参数,返回一个结果。
static String supplierTest(Supplier<String> supplier) {
return supplier.get();
}
@Test
public void supplier() {
String name = "冷冷";
// () -> name.length() 无参数,返回一个结果(字符串长度)
// 所以该lambda表达式可以实现Supplier接口
System.out.println(supplierTest(() -> name.length()+""));
}
6. Lambda及函数式接口的例子
参考链接:https://blog.csdn.net/z834410038/article/details/77370785