JDK8:Lambda表達式操作List集合


JDK8的流對list的處理提供了很大的方便,特別是做報表的時候才能真正體現出來這個功能的強大;結合日常使用過程,有兩個體會:一個是減少了數據庫連接,最忌諱在循環中進行數據查詢,特別是嵌套多層循環的時候;在循環中查表,嚴重影響整體性能;采用JDK8以后可以將所需的全部數據查詢出來,然后通過流很方便的就過濾出想要的數據;二是減少了for循環以及多重的for循環。

新建所需的實體類:LambdaFirstDemo 包含演示所有的字段信息
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LambdaFirstDemo {
/**
*用戶名稱
*/
private String userName;
/**
*年齡
*/
private Integer age;
/**
*性別
*/
private String sex;
}
新建所需的實體類:LambdaFirstDemo 包含演示所有的字段信息
@Data
@Accessors(fluent = true)
@NoArgsConstructor
@AllArgsConstructor
public class LambdaSecondDemo {
/**
*用戶名稱
*/
private String userName;
/**
*年齡
*/
private Integer age;
}
結合項目研發過程中對List集合的使用情況,主要存在以下使用場景:
1、快速的遍歷List集合

2、獲取List集合的某些字段,然后重新生成新的List集合

3、根據某些條件對List集合進行過濾處理,並將符合條件的數據存入另一個List集合

4、根據某個屬性或多個屬性對List集合中的數據進行排序操作

5、根據某個屬性或多個屬性對List集合進行分組操作

6、從List集合中提取某一個屬性信息,並生成新的List

@Slf4j
public class LambdaDemoTest {
public static void main(String[] args) {
// 准備各類演示數據
List<LambdaFirstDemo> demoList = new ArrayList<>();
LambdaFirstDemo lambdaFirstDemo1 = new LambdaFirstDemo("張三", 13, "男");
LambdaFirstDemo lambdaFirstDemo2 = new LambdaFirstDemo("李四", 23, "男");
LambdaFirstDemo lambdaFirstDemo3 = new LambdaFirstDemo("王五", 34, "女");
LambdaFirstDemo lambdaFirstDemo4 = new LambdaFirstDemo("李一", 43 , "男");
LambdaFirstDemo lambdaFirstDemo5 = new LambdaFirstDemo("古斯", 25, "女");
LambdaFirstDemo lambdaFirstDemo6 = new LambdaFirstDemo("三狗", 43, "男");
LambdaFirstDemo lambdaFirstDemo7 = new LambdaFirstDemo("二蛋", 23, "男");
demoList.add(lambdaFirstDemo1);
demoList.add(lambdaFirstDemo2);
demoList.add(lambdaFirstDemo3);
demoList.add(lambdaFirstDemo4);
demoList.add(lambdaFirstDemo5);
demoList.add(lambdaFirstDemo6);
demoList.add(lambdaFirstDemo7);

/**
*1、獲取list某些字段,然后重新組裝list並遍歷
*/
List<LambdaSecondDemo> lambdaSecondDemoList;
lambdaSecondDemoList = demoList.stream().map(lambdaFirstDemo -> new LambdaSecondDemo(lambdaFirstDemo.getUserName(), lambdaFirstDemo.getAge())).collect(Collectors.toList());
lambdaSecondDemoList.forEach(lambdaSecondDemo -> log.info("用戶名稱:{},年齡:{}", lambdaSecondDemo.userName(), lambdaSecondDemo.age()));
/**
* 2、利用stream().filter()對List進行過濾處理,並將符合條件的數據給另一個list賦值,最后對其進行遍歷
*/
List<LambdaFirstDemo> manLambdaFirstDemoList;
manLambdaFirstDemoList = demoList.stream().filter(lambdaFirstDemo -> "男".equals(lambdaFirstDemo.getSex())).collect(Collectors.toList());
manLambdaFirstDemoList.forEach(lambdaFirstDemo -> log.info("用戶名稱:{},年齡:{},性別:{}", lambdaFirstDemo.getUserName(), lambdaFirstDemo.getAge(), lambdaFirstDemo.getSex()));
/**
* 3、通過Sort方法可對集合中的單字段、多字段進行排序(正序、倒序)操作
*/
List<LambdaFirstDemo> sortSimpleLambdaFirstDemoList;
// 單字段正序
sortSimpleLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge)).collect(Collectors.toList());
sortSimpleLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年齡(正序):{}", sortLambdaFirstDemo.getAge()));
// 單字段倒序
sortSimpleLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge).reversed()).collect(Collectors.toList());
sortSimpleLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年齡(倒序):{}", sortLambdaFirstDemo.getAge()));
// 多條件正序
List<LambdaFirstDemo> sortMultiLambdaFirstDemoList;
sortMultiLambdaFirstDemoList = demoList.stream().sorted(Comparator.comparing(LambdaFirstDemo::getAge).thenComparing(LambdaFirstDemo::getUserName).reversed()).collect(Collectors.toList());
sortMultiLambdaFirstDemoList.forEach(sortLambdaFirstDemo -> log.info("年齡:{},用戶名稱:{}", sortLambdaFirstDemo.getAge(),sortLambdaFirstDemo.getUserName()));
/**
* 4、通過groupingBy根據制定字段進行分組操作
*/
// 按照年齡分組
Map<Integer, List<LambdaFirstDemo>> listMap = demoList.stream().collect(Collectors.groupingBy(LambdaFirstDemo::getAge));
System.out.println(listMap);
// 先按照性別分組再按照年齡分組
//Map<String/*性別id*/, Map<Integer/*年齡id*/, List<LambdaFirstDemo>>>
Map<String, Map<Integer, List<LambdaFirstDemo>>> groupMap = demoList.stream().collect(Collectors.groupingBy(LambdaFirstDemo::getSex, Collectors.groupingBy(LambdaFirstDemo::getAge)));
System.out.println("按照性別再按年齡分組:"+groupMap);

/**
* 5、提取對象中的某一元素,例子中計划取的是每個人的userName,注意list中類型對應,如果取的是age,就應該是integer類型
*/
List<String> mapList = demoList.stream().map(LambdaFirstDemo::getUserName).collect(Collectors.toList());
System.out.println("提取后:"+mapList);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM