一、Lamda简单介绍
Lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。
它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。
要理解函数式编程的产生目的,就要先理解匿名内部类。
先来简单看下匿名内部类调用方式。
interface Animal {
void run();
}
public class Main {
public static void see(Animal animal){
animal.run();
}
public static void main(String[] args) {
see(new Animal() {
@Override
public void run() {
System.out.println("动物在跑...");
}
});
}
}
Lamda表达式写法:
interface Animal {
void run();
}
public class Main {
public static void see(Animal animal){
animal.run();
}
public static void main(String[] args) {
see(()->System.out.println("动物在跑..."));
}
}
是不是挺简洁,这就是Lamda表达式语言,为了解决匿名内部类繁杂的操作而出现的。
Lamda语法有三种形式:
(参数) -> 单行语句;
(参数) -> { 多行语句 };
(参数) -> 表达式;
括号()可以大致理解为就是方法,里面是参数变量。
二、常见用法
1、线程
public class ThreadMain {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello Lamda!");
}
}).start();
// Lamda表达式
new Thread(()->{
System.out.println("Hello Lamda!");
}).start();
}
}
2、过滤及遍历
创建测试类
public class UserVO {
private Integer id;
private String name;
private Integer balance;
public UserVO() {
}
public UserVO(Integer id, String name, Integer balance) {
this.id = id;
this.name = name;
this.balance = balance;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getBalance() {
return balance;
}
public void setBalance(Integer balance) {
this.balance = balance;
}
@Override
public String toString() {
return "UserVO{" +
"id=" + id +
", name='" + name + '\'' +
", balance=" + balance +
'}';
}
}
public class FilterForEachTest{
public static void main(String[] args) {
List<UserVO> userVO = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userVO.add(user1);
userVO.add(user2);
userVO.add(user3);
userVO.add(user4);
// 任意匹配
boolean b = userVO.stream().anyMatch((u) -> u.getBalance() > 200);
System.out.println(b);
// 全匹配
boolean c = userVO.stream().allMatch((u) -> u.getBalance() > 200);
System.out.println(c);
//lamda表达式 过滤及遍历
userVO.stream().filter(u -> u.getId() > 1)
.forEach(u -> System.out.println(u.getId() + "->" + u.getName()));
}
}
3、提取为Map对象
public class MapTest {
public static void main(String[] args) {
List<UserVO> userVO = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userVO.add(user1);
userVO.add(user2);
userVO.add(user3);
userVO.add(user4);
//提取为map对象
Map<Integer, Integer> map = userVO.stream().
collect(Collectors.toMap(UserVO::getId, UserVO::getBalance, (o, n) -> o));
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "->" + entry.getValue());
}
}
}
4、对对象里面某个属性提取List对象
public class ListTest {
public static void main(String[] args) {
List<UserVO> userList = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userList .add(user1);
userList .add(user2);
userList .add(user3);
userList .add(user4);
// 对对象里面某个属性提取List对象
List<String> list = userList .stream().map(UserVO::getName).collect(Collectors.toList());
list.stream().forEach(s -> System.out.println(s));
}
}
5、对对象里某个字段求和
public class SumTest {
public static void main(String[] args) {
List<UserVO> userVO = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userVO.add(user1);
userVO.add(user2);
userVO.add(user3);
userVO.add(user4);
int sum = userVO.stream().mapToInt(obj -> obj.getBalance()).sum();
System.out.println(sum);
}
}
6、count计数
public class CountTest {
public static void main(String[] args) {
List<UserVO> userList = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
Map<String, Long> counted = userList.stream()
.collect(Collectors.groupingBy(u->u.getName(), Collectors.counting()));
System.out.println(counted);
}
}
7、分组
public class GroupingTest {
public static void main(String[] args) {
List<UserVO> userList = new ArrayList<>();
UserVO user1 = new UserVO(1, "Jason", 200);
UserVO user2 = new UserVO(2, "Lucy", 200);
UserVO user3 = new UserVO(3, "Lily", 300);
UserVO user4 = new UserVO(4, "Lily", 400);
userList.add(user1);
userList.add(user2);
userList.add(user3);
userList.add(user4);
// 变为Map<String,List<UserVO>>
Map<String, List<UserVO>> map = userList.stream()
.collect(Collectors.groupingBy(UserVO::getName));
for (Map.Entry<String, List<UserVO>> entry : map.entrySet()) {
System.out.println(entry.getKey() + "->" + entry.getValue());
}
}
}
三、总结
以上列出了Lamda表达式的常见用法,Lamda表达式中还有很多其他用法,大家有兴趣可以深入了解下。
版权声明:本文为angellee1988原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。