新特性 函数式接口
2019-08-19 本文已影响0人
测试员
概述
有且只有一个抽象方法的接口,称之为函数式接口,当然接口中可以包含其它的方法(默认,静态,私有)
定义一个函数式接口
/**
* @author Yuan-9826
* @FunctionalInterface 检验是否是函数式接口的标签
*/
@FunctionalInterface
public interface FuncDemo1 {
/**
* 定义一个抽象方法
* 这是一个Demo
*/
public abstract void method();
}
常用接口
1.接口:supplier<T>【是个生产型接口】
接口方法:T get()
例:
class LambdaDemo1 {
public static void main(String[] args) {
String a = "a";
String b = "b";
System.out.println(getString(()-> a+b));
}
public static String getString(Supplier<String> function){
return function.get();
}
}
2.接口:Consumer<T>【是个生产型接口】
接口方法:void accept(T t)【抽象方法】
例:
class LambdaDemo3 {
public static void main(String[] args) {
name("GoWin",(String name)->{
//反转字符串
System.out.println(new StringBuffer(name).reverse().toString());
}
);
}
public static void name(String name, Consumer<String> str) {
str.accept(name);
}
}
接口方法: andThen【默认方法】
例1:
class LambdaDemo4 {
public static void main(String[] args) {
String str = "AaBbCcDd";
method(str,
(m) -> System.out.println(str.toUpperCase()),
(m) -> System.out.println(str.toLowerCase())
);
}
public static void method(String str, Consumer<String> c1, Consumer<String> c2) {
c1.andThen(c2).accept(str);
}
}
例2:
class LambdaDemo5 {
public static void main(String[] args) {
String[] arr = {"男,张三", "女,李四", "男,王五", "女,赵六,"};
method(arr, (r) -> {
System.out.print(r.split(",")[0] + "==");
}, (r) -> {
System.out.println(r.split(",")[1]);
});
}
public static void method(String[] arr, Consumer<String> c1, Consumer<String> c2) {
for (String s : arr) {
c1.andThen(c2).accept(s);
}
}
}
3.接口: Predicate
接口方法:boolean test(T t)【抽象方法】
例:
class LambdaDemo7 {
public static void main(String[] args) {
String a = "abcdefghijklmn";
// 只有一个参数不用写类型
// 返回值很简单不用写return
System.out.println(isLength(a,pre->pre.length()==5));
}
public static boolean isLength(String str, Predicate<String> pre) {
return pre.test(str);
}
}
接口方法:boolean and(T t)【默认方法】
例:
class LambdaDemo8 {//满足所有条件
public static void main(String[] args) {
String a = "asdfzxcvqwer";
boolean b = checkLL(a
, (str) -> {
return str.length() > 1;
}
, (str) -> {
return str.contains("g");
}
);
System.out.println(b);
}
private static boolean checkLL(String str, Predicate<String> pre1, Predicate<String> pre2) {
return pre1.and(pre2).test(str);
}
}
接口方法:boolean or(T t)【默认方法】
例:
class LambdaDemo9 {//满足任意条件
public static void main(String[] args) {
String a = "asdfzxcvqwer";
boolean b = checkLL(a
, (str) -> {
return str.length() > 1;
}
, (str) -> {
return str.contains("g");
}
);
System.out.println(b);
}
private static boolean checkLL(String str, Predicate<String> pre1, Predicate<String> pre2) {
return pre1.or(pre2).test(str);
}
}
接口方法:boolean negate(T t)【默认方法】
例:
class LambdaDemo10 {
public static void main(String[] args) {
//取反
String like = "like";
System.out.println(checkLL(like,pre->pre.length()>1));
}
private static boolean checkLL(String str, Predicate<String> pre){
return pre.negate().test(str);
}
}
3.接口: Function<T,R>
接口方法: R apply(T t)【抽象方法】
例:
class LambdaDemo11 {
public static void main(String[] args) {
String a = "654123";
Integer ch = change(a, fun -> Integer.parseInt(a));
System.out.println("ch = " + ch);
}
public static Integer change(String str,Function<String,Integer> func){
return func.apply(str);
}
}
接口方法: andThen【默认方法】
例:
class LambdaDemo12 {
public static void main(String[] args) {
String s = "13206";
Integer c = change(s, fuc -> Integer.parseInt(s), fuc -> fuc - 900);
System.out.println("c = " + c);
}
public static Integer change(String str,Function<String,Integer> func1,Function<Integer,Integer> func2){
return func1.andThen(func2).apply(str);
}
}