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();
// }
}
网友评论