Java8型特性
Java8 新特性 新增的函数式接口
简介
函数式接口:接口中只有一个抽象方法时,但是可以有多个非抽象方法;可以使用注解@FunctionalInterface修饰,这样可以检查是否是函数接口;
使用
由于Lambda表达式的使用条件必须有函数式支持,所以可以用于Lambda表达式中;
Java8之前的函数式接口
常见的有:
java.lang.Runnable
java.util.concurrent.Callable
java.util.Comparator
java.io.FileFilter
Java8 新增的四大函数式接口
1,Consumer<T> :消费型接口
void accept(T t); //接受一个输入参数并且无返回的操作
应用
public static void main(String[] args) {
happy(100,(m) -> System.out.println("买衣服花了" + m + "元"));
}
private static void happy(double money, Consumer<Double> consumer) {
consumer.accept(money);
}
运行结果:
买衣服花了100元
2,Supplier<T> :供给型接口
T get(); //无参数,返回一个结果。
案例:随机场生一个数据,并保存到集合中
public static void main(String[] args) {
List<Integer> numList = getNumList(10, () -> (int) (Math.random() * 100));
for (Integer num : numList) {
System.out.println(num);
}
}
//产生一个随机数,并存储在List中
private static List<Integer> getNumList(int num, Supplier<Integer> supplier) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add(supplier.get());
}
return list;
}
运行结果:
21
78
96
23
61
33
69
69
94
85
3,Function<T,R>:函数型接口
R apple(T t); //接受一个输入参数,返回一个结果。
案例:处理字符串
public static void main(String[] args) {
String result = getStr(" hello world", (x) -> x.replaceAll(" ", ""));
System.out.println(result);
}
private static String getStr(String s, Function<String, String> function) {
return function.apply(s);
}
运行结果:
helloworld
4,Predicate<T> : 断言型接口
boolean test(T t);//接受一个输入参数,返回一个布尔值结果。
案例:将满足条件的String放入集合中
public static void main(String[] args) {
List<String> list = Arrays.asList("android", "ios", "h5", "Java", "php", "python");
List<String> strings = addStr(list, (s) -> s.length() > 3);
for (String str : strings
) {
System.out.println(str);
}
//不是Lambda表达式
addStr(list, new Predicate<String>() {
@Override
public boolean test(String s) {
return s.length() > 3;
}
});
}
private static List<String> addStr(List<String> stringList, Predicate<String> predicate) {
List<String> result = new ArrayList<>();
for (String str : stringList) {
if (predicate.test(str)) {
result.add(str);
}
}
return result;
}
运行结果:
android
Java
python
当然除了以上四大类还有很多不过都在 java.util.function包下,它包含了很多类,用来支持Java的函数式编程;