lambda表达式

函数式接口:有且仅有一个抽象方法的接口  借口中还可以包含其他的方法(默认方法  静态 私有)
语法糖  :使用更加方便,但是 远离不变的 代码语法
格式  :修饰符 interface 接口名称{
public abstract 返回值类型 方法名称(可选参数的信息);
}
可以加一个@FunctionalInterface
作用:可以检测接口是一个函数式接口 是:编译成功  否:编译失败(借口中没有抽象方法或抽象方法的个数多余1个
@overdide注解检查方法是否为重写的方法
是:编译成功  否:编译失败

函数是接口的使用:一般可以作为方法的参数和返回值类型

函数式编程:
lambda延迟的执行:日志存在性能浪费的问题  调用showlog方法 传递的第二个参数是一个拼接后的字符串,先把字符串拼接好,然后再调用showLog方法 showLOg方法如果传递的日志等级不是1集那么就不会是如此拼接后的字符串了 存在浪费

Supplier接口:
Supplier<T>接口被称生产型接口,指定接口的泛型是什么类型 那么接口中的get方法就会生产什么类型的数据  T get()
定义一个方法 方法的参数传递Supplier<T>接口,泛型执行String get方法就会返回一个string
public class 获取最大值 {
    public static int getMax(Supplier<Integer> sup){
        return sup.get();

    }
    public static void main(String[] args) {

        int[] arr ={-22,50,30,60,-56,-69,562,999,22};

        int max1 =getMax(() -> {
            int max = arr[0];
            for (int i : arr) {
                if (i > max) {
                    max = i;
                }


            }

        return max;

        });
        System.out.println(max1);

    }

}


Consumer接口:用于消费数据aaept(T t);
package 练习;
 /*
    Consumer接口默认方法andThen
    作用:需要两个Consumer接口,可以把两个Consumer接口组合奥一起,在对数据进行消费
    例如:Consumer<String>con1
    Consumer<String>con2
    String s = "111";
    con1.accept(s)
    con2.accept(s)
    con1.andThen(con2).accept;谁写前面谁先消费
     */

import java.util.function.Consumer;

public class andThen {
    public static void method(String s, Consumer<String> con1,Consumer<String> con2){

//       con1.accept(s);
//       con2.accept(s);
        //使用andThen方法
        con1.andThen(con2).accept(s);

    }

    public static void main(String[] args) {
        method("Hellow",(t)->{
            //把t进行大写输出
            System.out.println(t.toUpperCase());

        },(t)->{
            System.out.println(t.toLowerCase());

        });


}

}

Predicate<T>接口:
对某种数据类型的数据进行判断 结果返回一个boolean值
predicate接口汇总包含一个抽象方法:
boolean test(T t):用来对指定数据类型数据进行判断的方法
结果:符合条件 返回true
不符合条件 返回false
package 练习;


import java.util.function.Predicate;

public class Predicate类 {
    public static  boolean checkString(String s, Predicate<String> pre){
       return pre.test(s);
    }

    public static void main(String[] args) {
        //定义一个字符串

        String s="abcde";
        //调用cheackstring 方法对字符串进行校验 参数传递字符串和lambda表达式
//        boolean b = checkString(s,(String str)->{
//            //对参数传递的字符串进行判断  判断字符串的长度是否大于5,并吧判断的结果返回
//            return str.length()>5;
//        });
        boolean b = checkString(s,str->str.length()>5);

        System.out.println(b);
    }


}
and运算符
逻辑运算符:
&&  与运算符 有false则false
|| 或运算符 有true则true
!:相反
package 练习;

import java.util.function.Predicate;

public class lambda_name {
    public static  boolean compare(String s, Predicate<String> one,Predicate<String> two){
//        return  one.test(s) && two.test(s);
           return one.and(two).test(s);
    }

    public static void main(String[] args) {
        String m = "Hello world";
        boolean a = compare(m,(String str)->{
            return  str.length()>5;
        },(t)->t.contains("a"));
        System.out.println(a);
    }

}
or和nagate或和非
Function:用来根据与一个类型的数据得到另一个类型的数据
欠着称为前置条件 后者称为后置条件
Function类中最重要的抽象方法是R apply(T t),根据类型T的参数获取类型R的结果
使用场景:将String类型转化为Integer类型
package 练习;

import java.util.function.Function;

public class Functionlearn {
    public static  void change(String a, Function<String,Integer> fun){
        Integer num= fun.apply(a);
        //int num= fun.apply(a);->int类型的也可以
        System.out.println(num);
    }

    public static void main(String[] args) {
        String str = "1234";
        change(str,(t)->{
            //吧字符串转为Integer
            return Integer.parseInt(str);

        });

    }
}
Function中andThen:也是组和
package 练习;

import java.util.function.Function;

public class changePro {
    /*
    把String类型的“123”转换为Interter类型,吧转换后的结果+10
    把增加之后的Interger类型的数据,转换为String类型
    分析:首先创建change类 先把String转换为Integer类型

    因为Function类中有andthen方法 因此直接用

     */
    public static void change(String a, Function<String,Integer>fun1,Function<Integer,String>fun2){
      //       Integer num1=fun1.apply(a)+10;
     //  String s = fun2.apply(num1);
        String s =fun1.andThen(fun2).apply(a);
        System.out.println(s);


    }

    public static void main(String[] args) {
        String str2 ="123";
        change(str2,(t)->{
           Integer it = new Integer(str2);
           return  it;

        },(t)->{
            String str3 = String.valueOf(t);
            return  str3;
        });

    }
}

例子 详看4.14黑马

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值