常见的函数式接口

/*
    在jdk8之后,多了java.util.function 。这个包下面放了很多的常用的函数式接口。

    其中有一个接口叫做Supplier<T>(生产者), 里面有一个方法,可以获取一个对象。

    T get​(): 可以获取一个对象。


 */
public class Demo01Supplier {
    public static void main(String[] args) {
        method(()->"helloworld");

    }
    public static void method(Supplier<String> supplier){
        String s = supplier.get();//重写的接口的抽象方法get。午餐数
        System.out.println(s);
    }

}
import java.util.function.Supplier;

//    其中有一个接口叫做Supplier<T>(生产者), 里面有一个方法,可以获取一个对象。
//
//            T get​(): 可以获取一个对象。
/*
    使用函数式接口Supplier求数组元素的最大值
 */
public class Demo02SupplierTest {
    public static void main(String[] args) {
        int[] arr = new int[]{3, 4, 5, 2, 1, 10};
        getMax(() -> {
            int temp = 0;
            for (int i = 0; i < arr.length; i++) {
                if (arr[i] > temp) {
                    temp = arr[i];
                }

            }
            return temp;
        });


    }

    public static void getMax(Supplier<Integer> supplier) {
        Integer result = supplier.get();//无参数有返回值
        System.out.println(result);
    }
}

---------------------------------------------------------------------------------------

*
    在java.util.function包下,还有一个函数式接口叫做Consumer,这个接口表示消费者,可以消费一个数据(使用这个数据去干一些事情)

    Consumer<T>接口中的抽象方法:
        void accept​(T t): 消费一个数据。 接收到参数t,然后使用这个t。
 */
public class Demo02Consumer {
    public static void main(String[] args) {
//        method((b)-> System.out.println("我发现你了"));
      /*   method(new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.println(o+"你好啊");

            }
         });*/

        method((t) -> System.out.println("你好啊"));//打印你好啊
        method(System.out::print);//拿到t值,转去操作别的,不会产生引用。结果hello
        System.out.println("----------------------------");
        method((Object t) -> System.out.println(t));//hello
        method(System.out::println);//对象引用成员方法,拿到对象直接对对象进行操作//hello


    }

    public static void method(Consumer consumer) {
        consumer.accept("hello");
    }


}
public class Demo03Consummer {
    public static void main(String[] args) {
        method(s -> System.out.println(s.toUpperCase()),
                s -> System.out.println(s.toLowerCase()));
    }

    public static void method(Consumer<String> one, Consumer<String> two) {
        // 先调用one的accept,再调用two的accept
        //one.accept("Hello");
        //two.accept("Hello");

        // 可以把one和two合并成一个Consumer
        //Consumer three = one.andThen(two); //three是合并之后的结果,里面包含了one的操作和two的操作
        //three.accept("Hello"); //通过three调用accept方法,因为trhee是one和two合并之后的结果。索引会先通过one调用accept,再通过two调用accept

        //最终写法
        one.andThen(two).accept("Hello");
    }
}

/*
    下面的字符串数组当中存有多条信息,请按照格式“ 姓名:XX。性别:XX。 ”的格式将信息打印出来。

    要求将打印姓
    名的动作作为第一个 Consumer 接口的Lambda实例,将打印性别的动作作为第二个 Consumer 接口的Lambda实
    例,将两个 Consumer 接口按照顺序“拼接”到一起。



    使用两个Consumer,一个打印姓名,一个打印性别。

    最终打印结果
    姓名: 迪丽热巴  性别:女
    姓名: 古力娜扎  性别:女
    姓名: 马尔扎哈  性别:男

 */
public class Demo04ConsumerTest {
    public static void main(String[] args) {
        String[] array = {"迪丽热巴,女", "古力娜扎,女", "马尔扎哈,男"};

        method(s -> System.out.print("姓名:" + s.split(",")[0]),
                s -> System.out.println(" 性别:" + s.split(",")[1]),
                array);

    }

    //定义方法,用来打印
    public static void method(Consumer<String> one, Consumer<String> two, String[] arr) {
        //遍历数组,拿到数组中的每一个元素
        for (String s : arr) {
            //打印姓名
            //one.accept(s);
            //打印性别
            //two.accept(s);
            //合并成一个Consumer
            one.andThen(two).accept(s);
        }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_28761767/article/details/81173651