記錄一下,利用java新特性 lambda表達式的使用方法,這裏主要列舉常用的3個(list轉map,分組,過濾)
1. list轉map
//組裝list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "張三"));
userList.add(new User("222", "李四"));
//list轉map
Map<String, String> userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName)
);
//value是用戶對象時
Map<String, String> userMap2 = userList.stream().collect(
Collectors.toMap(User::getId, a -> a)
);
System.out.println("userMap === " + userMap);
運行結果
userMap === {111=張三, 222=李四}
特殊點:如果key存在相同時
/**
* 注意:如果存在key值相同的,可以用 (k1,k2)->k1 來設置
* (k1,k2)->k1 如果有重複的key,則保留key1,捨棄key2 --- 保留前者
* (k1,k2)->k2 如果有重複的key,則保留key2,捨棄key1 --- 覆蓋前者
*/
//組裝list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "張三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
);
System.out.println("userMap k1 === " + userMap);
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
);
System.out.println("userMap k2 === " + userMap);
運行結果
userMap k1 === {111=張三, 222=李四}
userMap k2 === {111=王五, 222=李四}
2. 分組
//組裝list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "張三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
Map<String, List<User>> userGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getId)
);
System.out.println("userGroupMap === " + userGroupMap);
運行結果
userGroupMap === {111=[User(id=111, name=張三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}
3. 過濾
//組裝list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "張三"));
userList.add(new User("222", "李四"));
userList.add(new User("111", "王五"));
List<User> userFilterList = userList.stream()
.filter(a -> a.getId().equals("111"))
.collect(Collectors.toList());
System.out.println("userFilterList === " + userFilterList);
運行結果
userFilterList === [User(id=111, name=張三), User(id=111, name=王五)]
4. 完整示例代碼
- 用戶對象
import lombok.Data;
/**
* @author yanghao
* @version User.java, v 0.1 2019-08-22 17:20
*/
@Data
public class User {
/**
* 用戶編號
*/
private String id;
/**
* 用戶名稱
*/
private String name;
/**
* 構造器
* @param id
* @param name
*/
public User(String id, String name){
this.id = id;
this.name = name;
}
}
- 測試類
import org.assertj.core.util.Lists;
import org.junit.Test;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author yanghao
* @version LambdaTest.java, v 0.1 2019-08-22 17:19
*/
public class LambdaTest {
@Test
public void test(){
//組裝list集合
List<User> userList = Lists.newArrayList();
userList.add(new User("111", "張三"));
userList.add(new User("222", "李四"));
//1. list轉map
Map<String, String> userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName)
);
//value是用戶對象時
Map<String, String> userMap2 = userList.stream().collect(
Collectors.toMap(User::getId, a -> a)
);
System.out.println("userMap === " + userMap);
//System.out.println("userMap2 === " + userMap2);
/**
* 注意:如果存在key值相同的,可以用 (k1,k2)->k1 來設置
* (k1,k2)->k1 如果有重複的key,則保留key1,捨棄key2 --- 保留前者
* (k1,k2)->k2 如果有重複的key,則保留key2,捨棄key1 --- 覆蓋前者
*/
userList.add(new User("111", "王五"));
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k1)
);
System.out.println("userMap k1 === " + userMap);
userMap = userList.stream().collect(
Collectors.toMap(User::getId, User::getName, (k1,k2)->k2)
);
System.out.println("userMap k2 === " + userMap);
//2. 分組
Map<String, List<User>> userGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getId)
);
System.out.println("userGroupMap === " + userGroupMap);
//3.過濾
List<User> userFilterList = userList.stream()
.filter(a -> a.getId().equals("111"))
.collect(Collectors.toList());
System.out.println("userFilterList === " + userFilterList);
}
}
運行結果
userMap === {111=張三, 222=李四}
userMap k1 === {111=張三, 222=李四}
userMap k2 === {111=王五, 222=李四}
userGroupMap === {111=[User(id=111, name=張三), User(id=111, name=王五)], 222=[User(id=222, name=李四)]}
userFilterList === [User(id=111, name=張三), User(id=111, name=王五)]