今天看Java8新特性,看到里面有的示例代码调用了这些函数接口,一脸懵啊~
所以博主就查了一下资料,看看这些函数接口有什么用处,让后面容易理解点,废话不多说,我们开始吧!!
1.Consumer接口
顾名思义,这是一个消费型接口,通过传入参数,然后输出值,不会返回值;在通俗点,就是你传一个参数进去,你可以对这个参数进行你想要的调整,然后输出出来,结束!
下面介绍使用方式及常用accept()、andThen()方法,还有其他Consumer接口:
- accept(T t) 提供T类型的输入参数,不返回执行结果
StringBuilder sb = new StringBuilder("Hello ");
//此处就是我定义的规则,进来的字符串拼接“Jack”字符串
Consumer consumer = (str) -> str.append("Jack!");
consumer.accept(sb);
//拼接完后进行输出
System.out.println(sb.toString()); // Hello Jack!
- andThen(Consumer super T> after) 拼接上一个consumer的规则
Consumer consumer1 = (str) -> str.append(" Bob!");
consumer.andThen(consumer1).accept(sb);
System.out.println(sb.toString()); // Hello Jack! Bob!
- BiConsumer
提供两个自定义类型的参数,不返回执行结果,意思就是你可以输入两个值进去处理
StringBuilder sb = new StringBuilder();
BiConsumer biConsumer = (a, b) -> {
sb.append(a);
sb.append(b);
};
biConsumer.accept("Hello ", "Jack!");
System.out.println(sb.toString()); // Hello Jack!
- 同时Consumer也可以被传入其他方法中使用,如下:
// 使用lambda表达式,forEach方法需要的就是一个Consumer接口
// Stream.of方法含义是将括号的值有序放入Stream中
Stream stream = Stream.of("aaa", "bbb", "ddd", "ccc", "fff");
Consumer consumer1 = (s) -> System.out.println(s);
//lambda表达式返回的就是一个Consumer接口
stream.forEach(consumer1);
//更直接的方式
//stream.forEach((s) -> System.out.println(s));
总结:
①.除了上面的,还有IntConsumer、DoubleConsumer等接口,使用方式与上面一样
①.除了上面的,还有IntConsumer、DoubleConsumer等接口,使用方式与上面一样
2.Supplier接口
Supplier 接口是一个供给型的接口,其实,说白了就是一个容器,可以用来存储数据,然后可以供其他方法使用的这么一个接口,是不是很明白了,如果还是不明白,看看下面的例子,一定彻底搞懂!
@Test
public void test_Supplier() {
//一、使用Supplier接口实现方法,只有一个get方法,无参数,返回一个值
Supplier supplier = new Supplier() {
@Override
public Integer get() {
//返回一个随机值
return new Random().nextInt();
}
};
System.out.println(supplier.get());
System.out.println("********************");
//二、 使用lambda表达式,
supplier = () -> new Random().nextInt();
System.out.println(supplier.get());
System.out.println("********************");
//三、使用方法引用
Supplier supplier2 = Math::random;
System.out.println(supplier2.get());
}
使用需要Supplier的接口方法,如optional对象有需要Supplier接口的方法
@Test
public void test_Supplier2() {
Stream stream = Stream.of(1, 2, 3, 4, 5);
//返回一个optional对象
Optional first = stream.filter(i -> i > 4)
.findFirst();
//optional对象有需要Supplier接口的方法
//orElse,如果first中存在数,就返回这个数,如果不存在,就放回传入的数
System.out.println(first.orElse(1));//输出结果5
System.out.println(first.orElse(7));//输出结果5
System.out.println("********************");
Supplier supplier = new Supplier() {
@Override
public Integer get() {
//返回一个随机值
return new Random().nextInt();
}
};
//orElseGet,如果first中存在数,就返回这个数,如果不存在,就返回supplier返回的值
System.out.println(first.orElseGet(supplier));//输出结果5
}
总结:
①.除了上面使用的 Supplier 接口,还可以使用下面这些 Supplier 接口。
IntSupplier 、DoubleSupplier 、LongSupplier 、BooleanSupplier,使用方法和上面一样。
②.Supplier 接口可以理解为一个容器,用于装数据的。
③.Supplier 接口有一个 get 方法,可以返回值。
③.Supplier 接口有一个 get 方法,可以返回值。
3.Predicate 接口
Predicate 接口是一个谓词型接口,其实,这个就是一个类似于 bool 类型的判断的接口
- test (T t) 对给定的输入参数执行操作,返回一个boolean类型的结果(布尔值函数)
Predicatepredicate = number -> number != 0; System.out.println(predicate.test(10)); //true
- and(Predicate super T> other) 拼接一个Predicate条件
//承接上面一段代码 predicate = predicate.and(number -> number >= 10); System.out.println(predicate.test(10)); //true
- or(Predicate super T> other) 就是或者了
// 承接上面代码 predicate = predicate.or(number -> number != 10); System.out.println(predicate.test(10)); //true
- negate() 这个就是取反
// 承接上面代码 predicate = predicate.negate(); System.out.println(predicate.test(10)); //false
总结:
①.还可以使用 DoublePredicate接口,使用方式和上面一样。 ②.Predicate接口可以理解为一个用来做条件判断的接口
4.Function接口
function的作用是转换,接收一个参数,返回一个结果;
Function
我们看下示例,介绍一下常用方法就理解了
- apply(T t)
// 例如像定义的泛型一样,输入的参数为String类型,返回的参数为Integer类型
Function test=i->Integer.parseInt(i)+1;
test.apply("5");// 6
- andThen(Function super R, ? extends V> after) 先执行name在执行square
Functionname = e -> e * 2; Function square = e -> e * e; int value = name.andThen(square).apply(3);// 36
- compose(Function super V, ? extends T> before) 先执行square在执行name
//承接上面代码 int value2 = name.compose(square).apply(3);// 18
总结:
①.除了上面使用的 Function 接口,还可以使用下面这些 Function 接口。
IntFunction 、DoubleFunction 、LongFunction 、ToIntFunction 、ToDoubleFunction 、DoubleToIntFunction 等等,使用方法和上面一样。
②. Function 接口是一个功能型接口,是一个转换数据的作用。
③. Function 接口实现 apply 方法来做转换。
IntFunction 、DoubleFunction 、LongFunction 、ToIntFunction 、ToDoubleFunction 、DoubleToIntFunction 等等,使用方法和上面一样。



