Java8->Lambda

一、基本语法

左侧:Lambda表达式参数列表

右侧:Lambda表达式所需执行的功能,即Lambda体

接口中只有一个抽象方法,称为函数式接口,在接口中可以使用注解@FunctionalInterface

  1. 无参数,无返回值()->System.out.println(“hah”)
@Test
public void test_1() {

    Runnable r = new Runnable() {
        @Override
        public void run() {
            System.out.println("this is format");
            System.out.println("this is format");
        }
    };

    new Thread(r).start();

    System.out.println("-----------------------------");
    Runnable rr = () -> {
        System.out.println("this is new format");
        System.out.println("this is new format");
    };

    new Thread(rr).start();

}

2.有一个参数,无返回值(x)->System.out.println(x)

@Test
public void test_2() {

    Consumer<String> con = new Consumer<String>() {
        @Override
        public void accept(String s) {
            System.out.println(s);
        }
    };
    con.accept("this is test");

    System.out.println("-----------------------------");

    Consumer<String> conn = (x) -> System.out.println(x);

    conn.accept("lambda test");

}

3.有两个以上的参数,有返回值 (x,y)->{ return xx;}

@Test
public void test_3() {

    Comparator<Integer> com = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1.compareTo(o2);
        }
    };

    System.out.println(com.compare(1, 3));

    System.out.println("----------------------------");

    Comparator<Integer> comm = (x, y) -> x.compareTo(y);
    Comparator<Integer> commm = (x, y) -> {
        System.out.println("");
        return x.compareTo(y);
    };

    System.out.println(comm.compare(1, 3));
    System.out.println(commm.compare(1, 3));
}

如果实现只有一句,则return可以省略
Collections.sort(list,(x,y)-> x.getAge()-y.getAge());

二、四大内置核心函数式接口

1.Consumer<T>:消费型接口

void accept(T t);

2.Supplier<T>:供给型接口

T get();

3.Functjion<T ,R>:函数型接口

R apply(T t);

4.Predicate<T>:断言型接口

boolean test(T t);

三、方法引用与构造器引用

方法引用:主要三种语法格式:

对象::实例方法名

类::静态方法名

类::实例方法名

使用条件:

1.lambda体中调用方法的参数列表与返回值类型,与函数式接口中的抽象方法的函数参数列表与返回值保持一致。

2.若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,可以使用ClassName::mothod.

举例:

Bipredicate(String,String) bp = (x,y) -> x.equals(y);

Bipredicate(String,String) bp = (x,y) -> String::equals;

构造器引用:

Supplier<Person> su1 =() -> new Person();

Supplier<Person> su2 = Person::new;

    原文作者:彳亍的骆驼
    原文地址: https://zhuanlan.zhihu.com/p/42226491
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞