概述
前面我们对lambda表达式进行了学习,知道了它是基于“函数式接口”的支持,那就会出现一个问题,如果我们想用lambda进行编程,难道每次都有我们自己去自定义接口吗,那还不如不用呢。答案是:当然不会了,java8中已经给我们内置了一系列的函数式接口,下面我们就对四大核心函数式接口进行学习,当然不止这四种,其他的都是基于这个进行变形。
四大核心函数式接口
import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
/*
* Java8 内置的四大核心函数式接口
*
* Consumer<T> : 消费型接口
* void accept(T t);
*
* Supplier<T> : 供给型接口
* T get();
*
* Function<T, R> : 函数型接口
* R apply(T t);
*
* Predicate<T> : 断言型接口
* boolean test(T t);
*
*/
public class LamabdaTrain3 {
//Consumer<T> : 消费型接口 void accept(T t);
public static void consume(Double money, Consumer<Double> con){
con.accept(money);
}
@Test
public void test1(){
consume(1000.0,x-> System.out.println("飞哥每个月都要消费"+x+"元,去Big health care"));
}
//Supplier<T> :供给型接口 T get();
//为集合中添加指定个数的元素
public static List<Integer> supplier(Integer num, Supplier<Integer> sup) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++){
Integer integer = sup.get();
list.add(integer);
}
return list;
}
@Test
public void test2(){
List<Integer> supplier = supplier(6, () -> (int) (Math.random() * 10));
supplier.forEach(x-> System.out.println(x));
}
//Function<T, R> : 函数型接口 R apply(T t);
public static String function(String s, Function<String,String> function){
return function.apply(s);
}
@Test
public void test3(){
String s = "java8-lambda";
String s1 = function(s, x -> x.substring(6, s.length() - 1));
System.out.println(s1);
}
//Predicate<T> : 断言型接口 boolean test(T t);
public static List<String> predict(List<String> l, Predicate<String> pre){
List<String> list = new ArrayList<>();
for (String s:l){
if (pre.test(s)) list.add(s);
}
return list;
}
@Test
public void test4(){
List<String> list = Arrays.asList("java","hadoop","spark","hive","kafka","hbase","zookeeper");
List<String> predict = predict(list, s -> s.length() > 4);
predict.forEach(System.out::println);
}
}
java8中的内置函数式接口都在java.util.function
包下:
所以大家在使用lambda表达式的时候就很方便了,不需要我们自己去写接口了。