@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>() {@Overridepublic 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>() {@Overridepublic 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>() {@Overridepublic 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 的 map(Function<? super T, ? extends U> mapper)方法
实例一//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>() {@Overridepublic 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>(){@Overridepublic String apply(String str) {String result = "";for (int i = str.length() - 1; i >= 0; i--) {result += str.charAt(i);}return result;}};