【有书共读】Java攻略 读书笔记07
java.util.function包
java标准库中的许多接口仅包含一个抽象方法,属于函数式接口。为此,java 8专门定义了java.util.function包,它包含可以在库的其余部分重用的函数式接口。
java.util.function包中的接口分为四类,包括:Consumer(消费型接口)、Supplier(供给型接口)、Perdicate(谓词型接口)、Function(功能型接口).
Consumer接口传入一个泛型数据,不返回任何值。
Supplier接口不传入参数,返回一个值。
Perdicate接口传入一个参数,返回一个布尔值。
Function接口传入一个参数,返回一个值。
Consumer接口
Consumer接口接收一个泛型的参数T,然后调用accept,对这个参数做一系列的操作,没有返回值;可以理解为把参数消费掉了,故Consumer接口翻译过来也称之为消费型接口,接口的定义如下:
@FunctionalInterface
public interface Consumer<T> {
//单一的抽象方法
void accept(T t);
//用于复合操作的默认方法
default Consumer<T> andThen(Consumer<? super T> after{
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t);};
}
}
在所有传入Consumer作为参数的方法中,最典型的forEach方法就是使用的Consumer接口,虽然没有任何的返回值,但是却向控制台输出了语句。
//forEach方法的定义,然后将集合中的每个元素作为消费行为的accept方法的参数执行
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
如下例子:
/**
* 打印集合中的元素
*/
List<String> strings = Array.asList("this","is","a","list");
//匿名内部类实现
strings.forEach(new Consumer<String>(){
@override
public void accept(String s){
System.out.println(s);
}
});
strings.forEach(s -> System.out.println(s));//lambda表达式
strings.forEach(System.out::println);//方法引用
java.util.function包还定义了三种Consumer<T>的基本变体,以及一种双参数形式
| 接口 | 单一抽象方法 |
|---|---|
| IntConsumer | void accept(int x) |
| DoubleConsumer | void accept(double x) |
| LongConsumer | void accept(long x) |
| BiConsumer | void accept(T t,U u) |
BiConsumer接口的accept方法传入两个泛型参数,这两个泛型参数应为不同的类型。
#Java##笔记##读书笔记#