Java8|Java8 新特性 四大内置核心函数式接口及其扩展
四大内置核心函数式接口
Java内置的函数式接口是为了方便开发者使用Lambda表达式,对于应对大部分函数式接口的使用而提出的。有了这些内置接口,程序员不用自己在代码中去定义,就能完成大部分工作需求。
- Consumer
:消费型接口(无返回值,有一个泛型的输入参数)
@FunctionalInterface
public interface Consumer {
void accept(T t);
default Consumer andThen(Consumer super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t);
after.accept(t);
};
}
}
- Supplier
:供给型接口(无输入参数,有一个泛型的返回值)
@FunctionalInterface
public interface Supplier {
T get();
}
- Function
:函数型接口(有一个泛型的输入参数和一个泛型的返回值)
@FunctionalInterface
public interface Function {
R apply(T t);
default Function compose(Function super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
static Function identity() {
return t -> t;
}
}
- Predicate
:断言型(判断型)接口:(有一个泛型的输入参数,返回一个bool值)
@FunctionalInterface
public interface Predicate {
boolean test(T t);
default Predicate and(Predicate super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate negate() {
return (t) -> !test(t);
}
default Predicate or(Predicate super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static Predicate isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
从上面四个接口的源码中可以看到,接口中不一定只有一个方法的才是函数式接口,一个接口是函数接口的充要条件是有且仅有一个抽象方法。接口中的其他方法可以通过加上default关键字提供默认实现,或者是一个static修饰的静态方法。
四大内置核心函数式接口使用方法。
public class TestLambda2 {
//Consumer消费型接口:(无返回值,有一个泛型的输入参数)
@Test
public void test1() {
happy(10000, money -> System.out.println("发了" + money + "元工资,开心啊"));
}
//处理一个数据
public void happy(double money, Consumer consumer) {
consumer.accept(money);
}//供给型接口(无输入参数,有一个泛型的返回值)
@Test
public void test2(){
getNumList(10, () -> (int) (Math.random() * 100)).forEach(System.out::println);
}
//获取一个整数集合
public List getNumList(int num, Supplier supplier) {
List list = new ArrayList<>();
for (int i = 0;
i < num;
i++) {
list.add(supplier.get());
}
return list;
}//Function函数型接口(有一个泛型的输入参数和一个泛型的返回值)
@Test
public void test3(){
System.out.println(strHandler("\t\n" + "你好啊!!!哈哈\r\n\t", String::trim));
}
//处理字符串后返回
public String strHandler(String str, Function function) {
return function.apply(str);
}//Predict 断言型(判断型)接口:(有一个泛型的输入参数,返回一个bool值)
@Test
public void test4(){
List list = Arrays.asList("Hello","what","is","your","name");
filterStr(list, s -> s.length() > 3).forEach(System.out::println);
}
//将满足条件的字符串,放入集合中
public List filterStr(List list, Predicate predicate) {
List strings = new ArrayList<>();
list.forEach(s -> {
if (predicate.test(s)) {
strings.add(s);
}
});
return strings;
}
}
上述代码中使用了方法引用。即需要提供一个函数式接口的地方,不仅可以使用Lambda表达式,还可以使用函数的引用,只需要该函数的输入参数和返回值与函数式接口中的抽象方法一致即可。例如上述代码中的String::trim以及System.out::println。
扩展接口 【Java8|Java8 新特性 四大内置核心函数式接口及其扩展】如果上述四大接口不能满足需求,还有其他一些内置接口可以选用,具体如下,就不一一列举了其使用方法了。
文章图片
其他函数式接口
推荐阅读
- 我们重新了解付费。
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 感恩之旅第75天
- 涉毒患者(新诗)
- 危险也是机会
- 新年第一部电影,一本满足
- 六步搭建ES6语法环境
- 以读攻“毒”唤新活动曹彦斌打卡第二天
- 六月更新的......
- 绘本讲师训练营【18期】14/21《我的情绪小怪兽》故事会新体验