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