/* 在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); } } }