【有书共读】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##笔记##读书笔记#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务