原 java8 lambda表达式常见用法
版权声明:本文为博主原创文章,请尊重他人的劳动成果,转载请附上原文出处链接和本声明。
本文链接:https://www.91mszl.com/zhangwuji/article/details/1314
一:循环集合【lambda】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 循环集合[lambda]
userList.forEach(item -> {
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
李四
女
20
王五
男
32
二:循环集合【stream】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 循环集合[stream]
userList.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
李四
女
20
王五
男
32
三:集合过滤【查询年龄 > 25】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 集合过滤[查询年龄 > 25]
List<User> newList=userList.stream().filter(item -> item.getAge()>25).collect(Collectors.toList());
newList.stream().forEach(item -> {
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
王五
男
32
四:分组【按照性别进行分组】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 分组[按照性别进行分组]
Map<String, List<User>> mp=userList.stream().collect(Collectors.groupingBy(User::getSex));
mp.forEach((key, value)->System.out.println("性别:" + key));
}
执行结果:
性别:女
性别:男
五:排序 - 升序【排序字段为字符串类型 name】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 4 排序 - 升序[排序字段为字符串类型 name]
List<User> sortList1=userList.stream().sorted((o1, o2) -> o1.getName().compareTo(o2.getName())).collect(Collectors.toList());
sortList1.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
李四
女
20
王五
男
32
六:排序 - 降序【排序字段为字符串类型 name】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 排序 - 降序[排序字段为字符串类型 name]
List<User> sortList2=userList.stream().sorted((o1, o2) -> o2.getName().compareTo(o1.getName())).collect(Collectors.toList());
sortList2.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
王五
男
32
李四
女
20
张三
女
18
七:排序 - 升序【排序字段为数字类型 age】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 排序 - 升序[排序字段为数字类型 age]
List<User> sortList3=userList.stream().sorted((o1, o2) -> o1.getAge() - o2.getAge()).collect(Collectors.toList());
sortList3.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
李四
女
20
王五
男
32
八:排序 - 降序【排序字段为数字类型 age】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 排序 - 降序[排序字段为数字类型 age]
List<User> sortList4=userList.stream().sorted((o1, o2) -> o2.getAge() - o1.getAge()).collect(Collectors.toList());
sortList4.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
王五
男
32
李四
女
20
张三
女
18
九:获取集合对象的某一属性返回一个新集合【获取userList中的name字段然后返回一个新的list】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 6 获取集合对象的某一属性返回一个新集合[获取userList中的name字段然后返回一个新的list]
List<String> strList = userList.stream().map(item -> item.getName()).collect(Collectors.toList());
strList.stream().forEach(item -> {
System.out.println(item);
});
}
执行结果:
张三
李四
王五
十:判断集合中是否存在某个值【判断userList中是否有age=20的数据】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 判断集合中是否存在某个值[判断userList中是否有age=20的数据]
boolean flag=userList.stream().anyMatch(item -> item.getAge() == 20);
System.out.println(flag);
}
执行结果:
true
十一:统计【按照年龄进行sum】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 统计[按照年龄进行sum]
long count=userList.stream().mapToLong(User::getAge).sum();
System.out.println(count);
}
执行结果:
70
十二:求集合中某个属性的最大值、最小值、平均值、总和、数量
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// 求集合中某个属性的最大值、最小值、平均值、总和、数量
LongSummaryStatistics summary=userList.stream().mapToLong(item -> item.getAge()).summaryStatistics();
long max=summary.getMax();
long min=summary.getMin();
double average=summary.getAverage();
long sum=summary.getSum();
long count=summary.getCount();
System.out.println(max);
System.out.println(min);
System.out.println(average);
System.out.println(sum);
System.out.println(count);
}
执行结果:
32
18
23.333333333333332
70
3
十三:distinct对字段进行去重
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("李四");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// distinct对字段进行去重
List<Integer> integerList=Arrays.asList(1,2,3,4,5,5,5,6);
List<Integer> distinctList=integerList.stream().distinct().collect(Collectors.toList());
System.out.println(distinctList);
}
执行结果:
[1, 2, 3, 4, 5, 6]
十四:list去重 - 单个字段【根据name字段去重(注意去重后是无序的)】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("张三");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// list去重 - 单个字段[根据name字段去重(注意去重后是无序的)]
List<User> list1=userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(cn -> cn.getName()))), ArrayList::new));
list1.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
王五
男
32
十五:list去重 - 多个字段【根据name和sex字段去重(注意去重后是无序的)】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("张三");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// list去重 - 多个字段[根据name和sex字段去重(注意去重后是无序的)]
List<User> list2=userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(cn -> cn.getName() + cn.getSex()))), ArrayList::new));
list2.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
王五
男
32
十六:limit【限制只取2条数据】
public static void main(String[] args) {
List<User> userList=new ArrayList<>();
User u1=new User();
u1.setName("张三");
u1.setSex("女");
u1.setAge(18);
User u2=new User();
u2.setName("张三");
u2.setSex("女");
u2.setAge(20);
User u3=new User();
u3.setName("王五");
u3.setSex("男");
u3.setAge(32);
userList.add(u1);
userList.add(u2);
userList.add(u3);
// limit[限制只取2条数据]
List<User> limitList=userList.stream().limit(2).collect(Collectors.toList());
limitList.stream().forEach(item ->{
System.out.println(item.getName());
System.out.println(item.getSex());
System.out.println(item.getAge());
System.out.println();
});
}
执行结果:
张三
女
18
张三
女
20
十七:对userList根据tuId进行去重, lambda groupby 去重后无法获取到去重后的list, 所以采用如下的方式来进行去重
List<UserInfo> apiList=userList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getTuId()))), ArrayList::new));
十八:比较2个list差集
List<BusinessDistrict> subtractionList=apiList.stream()
.filter(item -> !dbList.stream().map(e -> e.getBizCode()).collect(Collectors.toList()).contains(item.getBizId()))
.collect(Collectors.toList());
十九:将list转为map
1)list转map,key为tuId, name为 tuName
List<UserInfo> apiList=userInfoMapper.selectUserInfo();
Map<String, String> map=apiList.stream().collect(Collectors.toMap(UserInfo::getTuId, UserInfo::getTuName));
2)假设name出现了重复,此时会报 java.lang.IllegalStateException: Duplicate key
List<UserInfo> apiList=userInfoMapper.selectUserInfo();
Map<String, UserInfo> map=apiList.stream().collect(Collectors.toMap(UserInfo::getName, Function.identity());
3)解决上面报 java.lang.IllegalStateException: Duplicate key的方法
List<UserInfo> apiList=userInfoMapper.selectUserInfo();
Map<String, UserInfo> map=apiList.stream().collect(Collectors.toMap(UserInfo::getName, Function.identity(), (key1, key2) -> key2));
备注:(key1, key2) -> key2)的意思是当key1,key2两个键值对的key值重复时,保留第二个即key2,反之(key1, key2) -> key1)则保留第一个即key1
二十:根据属性在list中进行过滤
1)根据id在list中查找等于id的值
List<TbUser> taaList = userList.stream().filter(item -> item.getOrgId().equals(childOrgId)).collect(Collectors.toList());
2)根据id在list中查找包含id中的值
List<TbUser> tuList = userList.stream().filter(f -> childOrgId.contains(f.getOrgId())).collect(Collectors.toList());
二十一:在list中查找元素并返回一个对象
TbUser us=userList.stream().filter(item -> item.getOrgId().equals(sonOrgId) && item.getNickName().equals(sonOrgName)).findFirst().orElse(null);
二十二:获取所有id集合
List<UserInfo> apiList=userInfoMapper.selectUserInfo();
List<String> idList=apiList.stream().map(UserInfo::getTuId).collect(Collectors.toList());
二十三:排序
1)正序排列
List<UserInfo> aa=apiList.stream().sorted(Comparator.comparing(UserInfo::getTuId)).collect(Collectors.toList());
2)倒序排列
List<UserInfo> aa=apiList.stream().sorted(Comparator.comparing(UserInfo::getTuId).reversed()).collect(Collectors.toList());
二十四:Map根据key和value进行排序
1)根据Map中的key进行排序
/**
* 功能:根据map中的key进行排序
* 网址:https://91mszl.com
* @Author: zxb
* @Date: 2022-04-11 11:21:41
*/
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put("2022年05月", "吃饭");
map.put("2022年04月", "睡觉");
map.put("2022年06月", "去超市");
Map<String, String> sortedMap = map.entrySet().stream().sorted(Map.Entry.comparingByKey())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
}
执行结果:
Sorted Map: [2022年04月=睡觉, 2022年05月=吃饭, 2022年06月=去超市]
2)根据Map中的value进行排序
/**
* 功能:根据map中的value进行排序
* 网址:https://91mszl.com
* @Author: zxb
* @Date: 2022-04-11 11:21:41
*/
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put("2022年05月", "33");
map.put("2022年04月", "22");
map.put("2022年06月", "55");
Map<String, String> sortedMap = map.entrySet().stream().sorted(Map.Entry.comparingByValue())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2, LinkedHashMap::new));
System.out.println("Sorted Map: " + Arrays.toString(sortedMap.entrySet().toArray()));
}
执行结果:
Sorted Map: [2022年04月=22, 2022年05月=33, 2022年06月=55]
二十五:根据list对象中的某个属性进行去重。
List<TopicInfoVO> propertyDistinct=propertyList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TopicInfoVO::getClassifyCode))), ArrayList::new
));
二十六:Collectors.partitioningBy是一种将流的元素始终分为两部分的方法,它返回一个在Map中存储值的收集器,注意:在Map中的key只能是true或false
public static void main(String[] args) {
UserInfo ui1=new UserInfo();
ui1.setName("张三");
ui1.setAge(20);
UserInfo ui2=new UserInfo();
ui2.setName("李四");
ui2.setAge(22);
UserInfo ui3=new UserInfo();
ui3.setName("王五");
ui3.setAge(24);
List<UserInfo> userList=new ArrayList<>();
userList.add(ui1);
userList.add(ui2);
userList.add(ui3);
Map<Boolean, List<UserInfo>> collect = userList.stream().collect(Collectors.partitioningBy(item -> item.getAge() > 21));
collect.forEach((k, v) -> {
System.out.println("key为: " + k + ",value为: " + v);
});
}
执行结果:
key为: false,value为: [UserInfo(name=张三, age=20)]
key为: true,value为: [UserInfo(name=李四, age=22), UserInfo(name=王五, age=24)]
2021-05-06 14:39:39 阅读(740)
名师出品,必属精品 https://www.91mszl.com
博主信息