lambda表达式
定义
关于lambda表达式,你需要知道以下几点
1,虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能
2,Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口,他只能在jdk8以后才能使用
3,基本语法:
(parameters) -> expression
或
(parameters) ->{ statements; }
关于lambda表达式的定义,就不再赘述了,直接开始使用,那么我们在哪些场景中会用到呢
遍历集合
以前我们遍历一个集合或者数组,我们是怎么做的呢
- 你可能是这样的
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
List<String> starList = Arrays.asList(stars);
for (int i = 0; i < starList .length; i++) {
System.out.println(starList.get(i));
}
- 也有可能是这样的
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
List<String> starList = Arrays.asList(stars);
for (String star : starList ) {
System.out.println(star);
}
- 但是利用lambda表达式,你可以这样
// 使用 lambda 表达式以及函数操作(functional operation)
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
List<String> starList = Arrays.asList(stars);
starList.forEach((star)-> System.out.println(star));
- 当然,你还可以这样
//双冒号操作符(double colon operator)
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
List<String> starList = Arrays.asList(stars);
starList.forEach(System.out::println);
在使用匿名内部类的时候
你以前创建线程是怎么做的呢
继承Thread类?一般不会吧
实现Runnable接口?
实现callable接口?
很多时候调用子线程并不需要确切的名字,大多是用匿名内部类
- 那么你创建线程可能是这样的
new Thread(new Runnable(){
@Override
public void run() {
System.out.println(1);
}
}).start();
- 但是利用lamda表达式.你可以这样
new Thread(()-> System.out.println(1)).start();
集合排序
有没有试过对集合排序
还是举上面的例子
- 以前你可能这样对集合排序
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
Arrays.sort(stars, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return (s1.compareTo(s2));
}
});
- 利用lambda表达式你可以这样
String[] stars = {"james", "kobe", "paul", "Anthony","rose", "love","jr", "Jordan "};
Arrays.sort(stars,(String s1,String s2)->(s1.compareTo(s2)));
- 当然你也可以根据首字母进行排序
//根据名字的首字母排序
Arrays.sort(stars,(String s1,String s2)->(s1.charAt(0)-s2.charAt(0)));
其他的排序也是类似,大家可以自行测试
stream和lamda的结合使用
- 我们先来创建一个实体类
/**
* @Description 球员
* @Author apdoer
* @Date 2019/4/19 15:02
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor //关于这三个注解,如果不了解lombok插件的也可以手写构造方法,getter/setter等,往期文章也讲到过
public class Player {
private String name;
private String team;
private Integer age;
private Integer score;
}
- 如果有一个集合我们想把其中的某个属性提取出来,比如下面这样
List<Player>list = new ArrayList<>();
list.add(new Player("kobe","lakers",31,30000));
list.add(new Player("james","lakers",34,33000));
list.add(new Player("paul","rocket",34,20000));
list.add(new Player("hardon","rocket",31,20000));
List<String> names = new ArrayList<>();
for (Player player : list) {
names.add(player.getName());
}
for (String name : names) {
System.out.println(name);
}
- 但是利用lambda表达式,你可以这样
List<Player>list = new ArrayList<>();
list.add(new Player("kobe","lakers",31,30000));
list.add(new Player("james","lakers",34,33000));
list.add(new Player("paul","rocket",34,20000));
list.add(new Player("hardon","rocket",31,20000));
//这样
List<String> names = list.stream().map(Player::getName).collect(Collectors.toList());
names.forEach(System.out::println);
- 当然我们还可以更复杂一点的操作,给每个球员的分数加1000
list.forEach( s -> s.setScore(s.getScore() + 1000));
list.stream().map(Player::getScore).collect(Collectors.toList()).forEach(System.out::println);
- 我们也可以过滤出分数大于30000年龄小于32的球员
list.stream()
.filter((p)->(p.getScore()>30000))
.filter((p)->(p.getAge()<32))
.collect(Collectors.toList())
.forEach(System.out::println);
- 当然也可以使用
.limit(int i)
来限制收集的个数,这就是api的使用了,大家自行尝试 - 排序呢,当然也是可以的,我们可以根据球员的分数来排序
list.stream()
.sorted((p1,p2)->(p1.getScore()-p2.getScore()))
.collect(Collectors.toList())
.forEach(System.out::println);
- 关于上面的用法,有以下几点
具体的各种方法大家可以去试,也可查询文档,方法级别的就不再赘述了
集合流化后可以收集成list,也可以收集成set,具体看需求
流化处理将是spring6的一大特性,大家可以关注
今天就写到这里,其他的想起来再写