Lamdba认识

#关于JDK.1.8新特性Lambda的认识
Java8的Lambda让我们可以更加专注于做什么(What),而不是怎么做(How)
疑问:Consumer,Function中包含多个方法,为什么被称为接口,解疑:函数式接口只有一个抽象方法default方法某默认实现,
不属于抽象方法(2).接口重写了Object的公共方法也不算入内,所以,Comparator虽然有两个抽象方法:

int compare(T o1, T o2);
boolean equals(Object obj);

其中 equals为Object的方法,不算入内,所以Comparator可以作为函数式接口。
一. 函数式接口(即适用于函数式编程场景的接口。)有且只有一个抽象接口。
二.(1)@FunctionalInterface注解,当使用这个注解定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。(2)当不使用该注解,满足函数式接口的定义,效果相同。

**@FunctionalInterface**
public interface MyFunctionalInterface {
void myMethod();
}

三.函数式接口提供了这4中常用式接口
1..Supplier接口(函数式接口-用来做生产的)
java.util.function.Supplier 接口仅包含一个无参的方法:T get() 。用来获取一个泛型参数指定类型的对象数据。由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。
2..Consumer接口(函数式接口-用来做消费的)
(1)java.util.function.Consumer 接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
void accept(意为消费一个指定泛型的数据)方法使用案例:

import java.util.function.Consumer;
public class Demo09Consumer {
private static void consumeString(Consumer<String> function) {
function.accept("Hello");
}
public static void main(String[] args) {
consumeString(s -> System.out.println(s));
} }

andThen方法使用案例:

public class TestCustomer {
    public  static  void counseString(String aa,Consumer<String> one,Consumer<String> two){
    one.andThen(two).accept(aa);
    }
    public static void main(String[] args) {
        String str="hello";
        counseString(str,
            s-> System.out.println(s.toUpperCase()),
            t-> System.out.println(t.toLowerCase())
        );
    }
Consumer 接口中的默认方法:andThen方法在执行时,java.util.Objects 的 requireNonNull 静态方法将会在参数为null时主动抛出  **NullPointerException** 异常。这省去了重复编写if语句和抛出空指针异常的麻烦。关于NullPointerException示例
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}

3 Predicate接口
含义:java.util.function.Predicate 接口。指的是接受一个参数,返回一个 Boolen类型的值,Predicate 接口中包含一个抽象方法: boolean test(T t) 。用于条件判断的场景,如:

public class Demo15PredicateTest {
private static void method(Predicate<String> predicate) {
boolean veryLong = predicate.test("HelloWorld");
System.out.println("字符串很长吗:" + veryLong);
}
public static void main(String[] args) {
method(s -> s.length() > 5);
} }

Predicate接口中还含有默认方法and(与),or(或),negate(取反)

public class Demo16PredicateAnd {
private static void method(Predicate<String> one, Predicate<String> two) {
boolean isValid = one.and(two).test("Helloworld");
System.out.println("字符串符合要求吗:" + isValid);
}
public static void main(String[] args) {
method(s -> s.contains("H"), s -> s.contains("W"));
} }

4.Function接口
java.util.function.Function<T,R> 接口用来接受一个输入参数,返回一个结果,Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将 String 类型转换为 Integer 类型。

public class Demo11FunctionApply {
private static void method(Function<String, Integer> function) {
int num = function.apply("10");
System.out.println(num + 20);
}
public static void main(String[] args) {
method(s -> Integer.parseInt(s));
}

默认方法andThen,用来进行组合操作,示例:

public  static  int getNum(String aa,Function<String,String>f1,Function<String,Integer>f2,Function<Integer,Integer> f3){
    return f1.andThen(f2).andThen(f3).apply(aa);
 }


    public static void main(String[] args) {
     String str="上海市,20";
        int num = getNum(str, t -> t.split(",")[1], t -> Integer.parseInt(t), n -> n += 100);
        System.out.println(num);
//        method(str->Integer.parseInt(str)+10,i ->i *= 10);
    }

四、Stream流思想
整体来看,流式思想类似于工厂车间的“生产流水线”。
五、方法引用
方法引用是lambda表达式的一种特殊形式,如果正好有某个方法满足一个lambda表达式的形式,那就可以将这个lambda表达式用方法引用的方式表示,但是如果这个lambda表达式的比较复杂就不能用方法引用进行替换。实际上方法引用是lambda表达式的一种语法糖。
在介绍方法引用使用方式之前,先将方法引用分下类
方法引用共分为四类:1.类名::静态方法名 2.对象::实例方法名 3.类名::实例方法名 4.类名::new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值