别考虑太多,直接去做就好!管它成败!
lamdba实际应用中,常针对集合进行操作,代表未来的趋势,慢慢的会替代所有的for循环操作。
它的优点:代码简介、容易并行计算、递归算法快。
缺点:不能debug、强制类型转换支持不好。
1、条件过滤集合
@Test
public void testLamdba(){
List<String> aList = Arrays.asList("aa", "bb", "cc", "dd", "ee");
/**
* aList根据条件 剔除元素
* 旧方式,迭代器遍历aList
* 新方式,流式语法
* 常用于基本数据类型集合
* stream()转换为文件流
* filter 过滤操作返回值为boolean
* collect转换对象操作
*/
List<String> bList = aList.stream().filter(str -> !str.equals("aa")).collect(Collectors.toList());
System.out.println("过滤前集合:"+aList);
System.out.println("过滤后集合:"+bList);
/**
* 复杂操作过滤或转换集合操作
* 常用于对象集合操作。
* map 操作流,返回集合元素对象,定义局部变量str,函数体针对str做操作。
*/
aList.add(null);
List<String> cList = aList.stream().filter(str -> !StringUtils.isEmpty(str)).map(str -> {
if(str.length()>2){
return str;
}else{
return str+"123";
}
}).filter(Objects::nonNull).collect(Collectors.toList());
System.out.println("过滤后集合:"+cList);
}
注意:我经常见到有很多人一个错误写法(阿里的也很多),把filter写在map()后面用来过滤空,但是如果集合对象有空,在map()方法就直接空指针了。这点需要注意,如果要过滤map方法返回值,那么后面可以再用一个filter方法。
输出结果:
过滤前集合:[aa, bb, cc, dd, ee]
过滤后集合:[bb, cc, dd, ee]
过滤后集合:[aa123, bb123, cc123, dd123, ee123]
2、去重操作
在1.8之前,对于基本元素,可以根据set集合不能重复的特性,list转set保持唯一。对于对象,需要重写hashcode()和equals()方法保持唯一。jdk1.8可以使用流式语法实现。同样的集合对象元素也需要重写hashcode()和equals()方法。
/**
* 处理重复元素
* distinct
*/
aList.add("aa");
aList.add("bb");
aList.add("cc");
System.out.println("处理重复前:"+aList);
List<String> dList = aList.stream().filter(str -> !StringUtils.isEmpty(str)).distinct().collect(Collectors.toList());
System.out.println("处理重复后:"+dList);
输出结果
处理重复前:[aa, bb, cc, dd, ee, null, aa, bb, cc]
处理重复后:[aa, bb, cc, dd, ee]
3、集合转逗号分隔字符串
@Test
public void testJoinString(){
List<String> list = Arrays.asList("AA", "BB", "CC", "BB", "CC", "AA", "AA");
/**
* 集合转换字符串
* distinct方法 去除重复数据
* collect方法 主要用来返回对应转换结果。
*/
String str = list.stream().distinct().collect(Collectors.joining(","));
System.out.println(str);
}
输出结果:
AA,BB,CC
4、对象集合提取map集合
@Test
public void testListToMap(){
List<StudentA> sList = Lists.newArrayList();
sList.add(new StudentA("san","12"));
sList.add(new StudentA("si","13"));
sList.add(new StudentA("sam","11"));
/**
* 提取list集合元素,组成对应的map集合
* 运用collect方法,方法体内进行转换操作
*/
Map<String,String> sMap = sList.stream().collect(Collectors.toMap(StudentA::getName,StudentA::getAge));
System.out.println(sMap);
}
输出结果:{san=12, si=13, sam=11}