@FunctionalInterface注解的类为函数接口
如java.utll包中的Comparator
java.util.function包中的Consumer,Supplier等
如何使用?
1,使用接口实现方法
2,使用lambda表达式
3,使用方法引用
List<String> list = Arrays.asList("aa","bb","cc");
list.forEach(new Consumer<String>() {
@Override
public void accept(String str ) {
System.out.print(str);
}
});
list.forEach(str -> System.out.print(str));
list.forEach(System.out::print);
一,Consumer接口
消费型 执行accept(T t) 没有返回值 ;可以用于赋值,输出等操作。如ArrayList的forEach(Consumer<? super E> action),Optional的 ifPresent(Consumer<? super T> consumer)
//optional源码
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
//使用
Optional.ofNullable(email).ifPresent(u->u.setId(5));
Optional.ofNullable(email).ifPresent(new Consumer<EmailBean>() {
@Override
public void accept(EmailBean email) {
email.setId(5);
}
});
二,Supplier接口
供给型 执行get()方法 方法无参数,返回一个值,使用这个接口的时候都会返回一个值,并且保存在这个接口中,可以理解为一个容器。用于返回默认值等场景。Optional 的 orElseGet(Supplier<? extends T> other)
Optional.ofNullable(email).orElseGet(()->new EmailBean());//如果value为null,则返回调用语句生成的对象
Supplier<Double> supplier = new Supplier<Double>() {
@Override
public Double get() {
return new Random().nextDouble();
}
};
System.out.println(supplier.get());
supplier=()->new Random().nextDouble();
System.out.println(supplier.get());
supplier=Math::random;
System.out.println(supplier.get());
三,Predicate 接口
判断型 执行test() 方法做判断,用于判断是否满足条件,过滤数据;如ArrayList的removeIf(Predicate<? super E> filter)和
Optional 的 public Optional<T> filter(Predicate<? super T> predicate)方法
实例一
//Predicate d->d.getTypeId()==3的作用就是 对方法传入参数d,然后返回d.getTypeId()==3的值
boolean is=Optional.ofNullable(email).filter(d->d.getTypeId()==3).isPresent();
boolean is1=Optional.ofNullable(email).filter(new Predicate<EmailBean>() {
@Override
public boolean test(EmailBean email) {
return email.getTypeId()==3;
}
}).isPresent();
实例二
List<String> list = Arrays.asList("aa","bb","cc");
list.removeIf(item->item.startsWith("a"));
四,Function 接口,
转换作用,将输入数据转换成另一种形式的数据并返回。用于需要处理某些数据的场景。
实例一
//optional源码
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
//使用
String title= Optional.ofNullable(email).map(d->d.getTitle()).orElse("默认名称");
String title1=Optional.ofNullable(email).flatMap(d->Optional.ofNullable(d.getTitle())).orElse("默认名称");
实例二
//将字符串倒序
Function<String,String> function2=new Function<String,String>(){
@Override
public String apply(String str) {
String result = "";
for (int i = str.length() - 1; i >= 0; i--) {
result += str.charAt(i);
}
return result;
}
};