四大函数式接口
lambda表达式、链式编程、函数式接口、Stream流失计算
函数式接口 : 一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
函数式接口除了唯一的抽象方法,还可以定义默认方法、静态方法和public方法
Java中的lambda无法单独出现,它需要一个函数式接口来盛放,lambda表达式方法体其实就是函数接口的实现
lambda语法的三部分
1、一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数
2、一个箭头符号:->
3、方法体,可以是表达式和代码块
(parameters) -> expression 或者 (parameters) -> { statements; }
常见的就是线程的Runnable
接口
//加不加 @FunctionalInterface对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
四大常见函数式接口
Function函数
//简化编程模型,在新版本的框架底层大量应用
@FunctionalInterface //接收一个参数并返回结果的函数
public interface Function<T, R> {
// 接收一个参数并返回结果的函数
// T 是参数的类型,R是返回的类型
R apply(T t);
}
package JUC.function;
import java.util.function.Function;
public class Demo01 {
public static void main(String[] args) {
Function function = new Function<String, String>() {
@Override
public String apply(String str) {
return str;
}
};
Function function1 = (str)->{return str;};
System.out.println(function1.apply("asd"));
}
}
Predicate谓语
断定性接口 : 有一个输入参数,返回值只能是 布尔值
@FunctionalInterface
public interface Predicate<T> {
//根据给定的参数进行判断
boolean test(T t);
}
package JUC.function;
import java.util.function.Predicate;
public class Demo02 {
public static void main(String[] args) {
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
return "sfdsf".equals(s);
}
};
Predicate<String> predicate1 = (s)->{
return s.isEmpty();
};
Predicate<Integer> predicate2 = number -> number==10;
System.out.println(predicate2.test(11));
System.out.println(predicate1.test("sdf"));
System.out.println(predicate.test("sfdsf"));
}
}
Consumer 消费者
消费接口 特点:只消费 不返回
@FunctionalInterface
public interface Consumer<T> {
//对给定的参数执行操作
void accept(T t);
}
package JUC.function;
import java.util.function.Consumer;
public class Demo03 {
public static void main(String[] args) {
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
Consumer<String> consumer1 = (s)->{
System.out.println(s);
};
StringBuilder sb = new StringBuilder("dsf");
Consumer<String> consumer2 = (str) -> sb.append(str);
consumer2.accept("32");
System.out.println(sb.toString());
consumer.accept("232");
consumer1.accept("sfsdsafsdf");
}
}
Supplier供应商
供给型接口 :没有参数 只有返回值
@FunctionalInterface
public interface Supplier<T> {
//获取结果值
T get();
}
package JUC.function;
import java.util.function.Supplier;
public class Demo04 {
public static void main(String[] args) {
Supplier<Integer> supplier = new Supplier<Integer>() {
@Override
public Integer get() {
return 1024;
}
};
Supplier<Integer> supplier1 = ()->{return 334;};
System.out.println(supplier1.get());
}
}