Java8之Lambda表达式
一. Lambda表达式
1.1基础语法 Java8中引入了一个新的操作符“->”:箭头操作符或者lambda操作符。
箭头左侧:Lambda表达式的参数列表:对应所实现接口抽象方法的参数列表。
箭头右侧:Lambda表达式所需要执行的功能:对应接口抽象方法的实现。
以上所提接口,均指新的函数式接口,也就是只有一个抽象方法的接口。
1.2语法格式(1) 无参数,无返回值:
() -> System.out.println(“Hello”);
1.3语法格式(2) 有一个参数,无返回值:
(param)-> syso
【只有一个参数时,小括号可以省略不写,建议写】
param -> syso
1.4语法格式(3) 有2个以上的参数,Lambda体中有多条语句,有返回值。Lambda体必须使用{}包裹
多参数,若只有一条语句,有返回值,{}和return都可以省略。
1.5语法格式(4) Lambda的参数列表的数据类型可以省略不写。因为JVM编译器可以通过上下文推断出其对于的类型,也就是“类型推断”。
(Integer x, Integer y) -> Integer.compare(x, y);
总结:
Lambda表达式之能省则省
左右遇一括号省
左侧推断类型省
Lambda表达式需要函数式接口的支持。
函数式接口:若接口中只有一个抽象方法,则称之为函数式接口。接口可以使用注解
@FunctionInterface修饰,且用这个注解修饰的接口,只能有一个抽象方法。
实际应用:
文章图片
文章图片
输出: 10000和400
二.四大函数式接口
文章图片
简单举例:
//##########Consumer##########
@Test
public void consumerTest() {
happy(1000, (money) -> System.out.println("我去吃螃蟹,消费了" + money + "元!"));
} public void happy(double money, Consumer csm) {
csm.accept(money);
}// ##########Supplier##########
@Test
public void suppTest() {
List list = getRInt(10, () -> (int)(Math.random()*100));
for (Integer integer : list) {
System.out.println(integer);
}
} public List getRInt(int num, Supplier supplier) {
List list = new ArrayList<>();
for (int i = 0;
i < num;
i++) {
list.add(supplier.get());
}
return list;
} // ##########Function##########
@Test
public void funcTest() {
String strHandler = strHandler("abcde", (str) -> str.toUpperCase());
System.out.println(strHandler);
} public String strHandler(String str, Function, String> fun) {
return fun.apply(str);
}// ##########Predicate##########
@Test
public void predicateTest() {
List> myList = Arrays.asList("hello", "wdy", "ok","world");
List> resultList = strFilter(myList, (s) -> s.indexOf("o") != -1);
for (String string : resultList) {
System.out.println(string);
}
} public List> strFilter(List> list, Predicate> predicate) {
List> strList = new ArrayList<>();
for (String string : list) {
if (predicate.test(string)) {
strList.add(string);
}
}
return strList;
}
三.方法引用和构造器引用 3.1 方法引用
以userList为例 ,通过 《类名::方法名》的方式操作数据
class User {
private String userName;
private Integer age;
}
List users = new ArrayList<>();
users.stream()
.map(User::getUserName)
.forEach(System.out::println)
3.2 构造器引用
// 比如我们有员工列表,里面放的员工,员工有name属性,我们要将name单独取出,并放到set中去
HashSet> hs = emps.stream()
.map(Employee::getName)
.collect(Collectors.toCollection(HashSet::new));
// HashSet::new 这就是构造器引用
【Java8之Lambda表达式】以上这些都是针对Lambda表达式的应用。比较偏理论。多练习就容易理解了。
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 太平之莲
- 闲杂“细雨”
- 七年之痒之后
- 深入理解Go之generate
- 由浅入深理解AOP
- 期刊|期刊 | 国内核心期刊之(北大核心)
- 生活随笔|好天气下的意外之喜
- 感恩之旅第75天
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决