【JDK8】Lambda表达式

参考:

1:【图灵学院】一节课搞定Lambda表达式与流式编程  https://www.bilibili.com/video/BV1j64y1F7GJ?from=search&seid=5355604263696009081

2: https://www.w3cschool.cn/java/java8-lambda-expressions.html

1、整体(使用场景:配合函数式接口使用)

函数式接口:Runnable、Callable、Compator、Consumer等

Lambda表达式,JDK8特性;允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。

(parameters) -> expression
(parameters) ->{ statements; }
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。 
 1 //入参为空
 2 TestDemo no_param = () -> "hi, no param";
 3 TestDemo no_param2 = () -> { return "hi, no param"; };
 4 System.out.println(no_param.hi());
 5 
 6 //单个参数
 7 TestDemo2 param = name -> name;
 8 TestDemo2 param2 = name -> { return name;};
 9 System.out.println(param.hei("hei, grils"));
10 
11 //多个参数
12 TestDemo3 multiple = (String hello, String name) -> hello + " " + name;
13 //一条返回语句,可以省略大括号和return
14 TestDemo3 multiple2 = (hello, name) -> hello + name;
15 //多条处理语句,需要大括号和return
16 TestDemo3 multiple3 = (hello, name) -> {
17     System.out.println("进入内部");
18     return hello + name;
19 };
20 System.out.println(multiple.greet("hello", "lambda"));

2、方法引用

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

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

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

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

3)类::实例方法,将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");

4)构造函数

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");

 

上一篇:虚拟机修改系统参数信息


下一篇:Jenkins相关环境部署