Java8新特性-Lambda表达式,被spring相关问题虐哭了

    // 4.返回值简写

    IRun run2 = () -> 10;

    run2.run();

}

}

interface IEat {

void eat(String thing);

}

interface ISpeak {

void talk(String who, String content);

}

interface IRun {

int run();

}




[](

)案例3 final类型参数

-------------------------------------------------------------------------



public class Demo03 {

public static void main(String[] args) {



    // 全写

    IAddition addition1 = (final int a, final int b) -> a + b;

    System.out.println(addition1.add(1, 2));

    // 简写

    IAddition addition2 = (a, b) -> a+b;

    System.out.println(addition2.add(2, 3));

}

}

interface IAddition {

int add(final int a, final int b);

}




[](

)Java8内置的函数式接口

-------------------------------------------------------------------------



Java8提供了一个java.util.function包,包含了很多函数式接口,我们来介绍最为基本的4个(为了节省篇幅,去掉了源码中的注释)



### [](

)Function接口



@FunctionalInterface

public interface Function<T, R> {

R apply(T t);



default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {

    Objects.requireNonNull(before);

    return (V v) -> apply(before.apply(v));

}



default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {

    Objects.requireNonNull(after);

    return (T t) -> after.apply(apply(t));

}



static <T> Function<T, T> identity() {

    return t -> t;

}

}




Function接口的唯一抽象方法是apply,作用是接收一个指定类型的参数,返回一个指定类型的结果



public class FunctionTest1 {

public static void main(String[] args) {

    FunctionTest1 ft = new FunctionTest1();

    //使用lambda表达式实现apply方法,返回入参+10。形式上如同传递了一个方法作为参数

    int res = ft.compute(1, v -> v + 10);

    System.out.println(res);//11

}



public int compute(int a, Function<Integer, Integer> function) {

    //使用者在使用本方法时,需要去编写自己的apply,

    //传递的funtion是一个行为方法,而不是一个值

    return function.apply(a);

}

}




默认方法compose作用是传入参数后,首先执行compose方法内的Function的apply方法,然后将其返回值作为本Function方法的入参,调用apply后得到最后返回值



public class FunctionTest2 {

public static void main(String[] args) {

    FunctionTest2 ft = new FunctionTest2();

    //调用compose

    //先+8,然后将得到的值*3

    System.out.println(ft.compute(2, v -> v * 3, v -> v + 8));//30

}



public int compute(int a, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {

    //将function2先接收入参a,调用apply后,将返回值作为新的入参,传入function1,调用apply返回最后结果

    return function1.compose(function2).apply(a);

}

}




默认方法andThen与compose正好相反,先执行本Function的apply,然后将结果作为andThen方法参数内的Function的入参,调用apply后返回最后结果



public class FunctionTest3 {

public static void main(String[] args) {

    FunctionTest3 ft = new FunctionTest3();

    //调用andThen

    //先*3,然后将得到的值+8

    System.out.println(ft.compute(2, v -> v * 3, v -> v + 8));//14

}



public int compute(int a, Function<Integer, Integer> function1, Function<Integer, Integer> function2) {

    //将function2先接收入参a,调用apply后,将返回值作为新的入参,传入function1,调用apply返回最后结果

    return function1.andThen(function2).apply(a);

}

}




静态方法identity的作用是传入啥返回啥,这里就不写例子了



### [](

)Consumer接口



package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Consumer {

void accept(T t);



default Consumer<T> andThen(Consumer<? super T> after) {

    Objects.requireNonNull(after);

    return (T t) -> { accept(t); after.accept(t); };

}

}




Consumer接口中accept方法的作用是接收指定参数类型,无返回值,重点在于内部消费



Consumer consumer = s -> System.out.println("hello " + s);

consumer.accept(“mike”);// hello mike




默认方法andThen作用是连续消费,从本Consumer开始,从外到内,针对同一入参。



Consumer consumer = s -> System.out.println("hello " + s);

Consumer consumer2 = s -> System.out.println("nice to meet you " + s);

consumer.andThen(consumer2).accept(“mike”);

//hello mike

//nice to meet you mike




### [](

)Predicate接口



package java.util.function;

import java.util.Objects;

@FunctionalInterface

public interface Predicate {

boolean test(T t);



default Predicate<T> and(Predicate<? super T> other) {

    Objects.requireNonNull(other);

    return (t) -> test(t) && other.test(t);

}
上一篇:Java8新特性的使用


下一篇:Java8--Lambda表达式