美文网首页
java8 lambda表达式

java8 lambda表达式

作者: 瓢鳍小虾虎 | 来源:发表于2020-10-18 10:20 被阅读0次

java lambda表达式支持函数式编程,如果你用过javascript,这种写法写起来还是会感觉有些亲切的。书写上要比传统的方式简洁不少。
例如:

//匿名内部类写法
new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("内部类写法");
            }
        }).start();

// lambda写法
new Thread(() -> System.out.println("lambda写法")).start();  

语法:
参数类型声明可选,编译器会自动识别
() -> {语句块或表达式}
x -> {语句块或表达式}
(x,y) -> {语句块或表达式}

例如:
TestDemo no_param = () -> "hi, no param";
TestDemo2 param = name -> name;
TestDemo2 param2 = name -> { return name;};
TestDemo3 multiple = (String hello, String name) -> hello + " " + name;

关于方法引用:

对象::实例方法,将lambda的参数当做方法的参数使用

Consumer<String> sc = System.out::println;
 //等效
 Consumer<String> sc2 = (x) -> System.out.println(x);
 sc.accept("618, 狂欢happy");

类::静态方法,将lambda的参数当做方法的参数使用

//ClassName::staticMethod  类的静态方法:把表达式的参数值作为staticMethod方法的参数
 Function<Integer, String> sf = String::valueOf;
 //等效
 Function<Integer, String> sf2 = (x) -> String.valueOf(x);
 String apply1 = sf.apply(61888);

类::实例方法,将lambda的第一个参数当做方法的调用者,其他的参数作为方法的参数。

//ClassName::instanceMethod  类的实例方法:把表达式的第一个参数当成instanceMethod的调用者,其他参数作为该方法的参数
BiPredicate<String, String> sbp = String::equals;
//等效
BiPredicate<String, String> sbp2 = (x, y) -> x.equals(y);
boolean test = sbp.test("a", "A");

关于构造方法:

无参构造

Supplier<User> us = User::new;
 //等效
 Supplier<User> us2 = () -> new User();
 //获取对象
 User user = us.get();

有参

//一个参数,参数类型不同则会编译出错
Function<Integer, User> uf = id -> new User(id);
//或加括号
 Function<Integer, User> uf2 = (id) -> new User(id);
//等效
Function<Integer, User> uf3 = (Integer id) -> new User(id);
User apply = uf.apply(61888);

//两个参数
BiFunction<Integer, String, User> ubf = (id, name) -> new User(id, name);
User 狂欢happy = ubf.apply(618, "狂欢happy");

继承及重写相关写法

接口A:

public interface A {

    String hi();

    String greet();

    default void hello() {
        System.out.println("A.hello");
    }

}

接口B:

public interface B {

    String hi();

    String hh();

    default void hello() {
        System.out.println("B.hello");
    }

}

接口C实现A B:

public class C implements A, B{

    @Override
    public String hi() {
        return "C.hi";
    }

    @Override
    public String greet() {
        return "C.greet";
    }

    @Override
    public String hh() {
        return "C.hh";
    }

    /**
     * 子类优先继承父类的方法, 如果父类没有相同签名的方法,才继承接口的默认方法。
     * 编译报错解决1:覆盖法
     */
    @Override
    public void hello() {
        System.out.println("C.hello");
    }

    /**
     * 编译报错解决2:指定实现的父接口
     */
//    @Override
//    public void hello() {
//        A.super.hello();
////        B.super.hello();
//    }

}

类D:

public class D {

    public void hello() {
        System.out.println("D.hello");
    }
}

C继承D实现AB:

public class C extends D implements A, B{

    @Override
    public String hi() {
        return "C.hi";
    }

    @Override
    public String greet() {
        return "C.greet";
    }

    @Override
    public String hh() {
        return "C.hh";
    }

    /**
     * 子类优先继承父类的方法, 如果父类没有相同签名的方法,才继承接口的默认方法。
     * 编译报错解决1:覆盖法
     */
//    @Override
//    public void hello() {
//        System.out.println("C.hello");
//    }

    /**
     * 编译报错解决2:指定实现的父接口
     */
//    @Override
//    public void hello() {
//        A.super.hello();
////        B.super.hello();
//    }

}

相关文章

网友评论

      本文标题:java8 lambda表达式

      本文链接:https://www.haomeiwen.com/subject/byiqmktx.html