• 欢迎访问尽管叫我疯子的网站,WordPress信息,WordPress教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站 QQ群
  • Git主题现已支持滚动公告栏功能,兼容其他浏览器,看到的就是咯,在后台最新消息那里用li标签添加即可。

Java 8 Lambda表达式使用总结

未分类 hucong 10个月前 (11-27) 357次浏览 0个评论

文章目录
Lambda 表达式
1、通过条件过滤 filter()
2、获取 list 某个字段组装新 list 方法 map()
3、去重 distinct()
4、单字段多字段排序 sort()和 stream.sorted()
sort()
stream.sorted()
5、汇总求和 sum()
6、找最值.min
7、list 转 map
8、通过指定字段进行分组 Collectors.groupingBy()
9、指定字段或者条件进行去重
10、其他:
Lambda 表达式
示例实体类

@Data
public class User{
private int id; //id
private Double score; //成绩
private String name; //姓名
private String sex; //性别
private BigDecimal property;//财产
private Date birthDay; //生日
}

1、通过条件过滤 filter()
获取男性用户集合:List< User> list = userList.stream().filter(t->t.getSex().equals(“female”)).collect(Collectors.toList());
其他参考:list 中快速进行数据筛选
2、获取 list 某个字段组装新 list 方法 map()
得到用户姓名组装成新的集合:List< String> list = userList.stream().map(t->getName()).collect(Collectors.toList());
3、去重 distinct()
distinct()返回由该流的不同元素组成的流。distinct()是 Stream 接口的方法。distinct()使用 hashCode()和 equals()方法来获取不同的元素。因此,我们的类必须实现 hashCode()和 equals()方法。如果 distinct()正在处理有序流,那么对于重复元素,将保留以遭遇顺序首先出现的元素,并且以这种方式选择不同元素是稳定的。在无序流的情况下,不同元素的选择不一定是稳定的,是可以改变的。distinct()执行有状态的中间操作。在有序流的并行流的情况下,保持 distinct()的稳定性是需要很高的代价的,因为它需要大量的缓冲开销。如果我们不需要保持遭遇顺序的一致性,那么我们应该可以使用通过 BaseStream.unordered()方法实现的无序流。

祛除重复元素:List< String> list = userList.stream().distinct().collect(Collector.toList());
延伸:Java 8 Stream.distinct() 列表去重示例
4、单字段多字段排序 sort()和 stream.sorted()
sort()
按成绩单字段排序:List< User> list = userList.sort(Comparator.comparing(User::getScore));
按成绩和 id 多字段排序:List< User> list = userList.sort(Comparator.comparing(User::getScore).thenComparing(User::getId));
按成绩,如果成绩中有 null 值则倒序排列:List< User> list = userList.sort(Comparator.comparing(User::getScore,Comparator.nullsLast(Comparator.naturalOrder())));
stream.sorted()
按成绩升序排列:List< User> list = userList.stream().sorted(Comparator.comparing(User::getScore)).collect(toList());
按成绩降序排列:List< User> list = userList.stream().sorted(Comparator.comparing(User::getScore)).reversed().collect(toList());
延伸:Java 8 Comparator nullsFirst naturalOrder 困惑
5、汇总求和 sum()
基本数据类型,如 int:int sumScore = userList.strem().mapToInt(User::getScore).sum();
其他数据类型,如 BigDecimal:BigDecimal totalProperty = userList.stream().map(User::getProperty).reduce(BigDecimal.ZERO,BigDecimal::add);
6、找最值.min
找到年龄最大的学生生日:Date maxBirthDay = userList.stream().map(User::getBirthday).max(Date::compareTo).get();
找到最低分:Double minScore = userList.stream().min(Comparator.comparingDouble(User::getScore)).get();
7、list 转 map
将 User 中的姓名作为键名,对应实体作为键值,组成新的 Map:Map< String,User> map = list.stream().collect(Collectors.toMap(User::getName,t->t));
将 User 中的姓名作为键名,对应实体作为键值,组成新的 Map,如果有重复键名则保留先进入 map 的那一个:Map< String,User> map = list.stream().collect(Collectors.toMap(User::getName,t -> t,(k1,k2)->k1));
//注:toMap 如果集合对象有重复的 key,会报错 Duplicate key …Name 可能重复。可以用 (k1,k2)->k1 来设置,如果有重复的 key,则保留 key1,舍弃 key2
8、通过指定字段进行分组 Collectors.groupingBy()
根据性别进行分组:Map> groupBySex = userList.stream().collect(Collectors.groupingBy(User::getSex));
9、指定字段或者条件进行去重
根据分数去重实体:List< User> list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getScore))),ArrayList::new));
如果两个对象分数和性别一致,则去重:List< User> list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->new TreeSet<>(Comparator.comparing(t->t.getName()+t.getSex()))),ArrayList::new));
10、其他:
List< Integer>转成 List< String>
List< String> list = intList.stream().map(t->String.format(“%s”,t)).collect(toList());
List< Integer>正、倒序
正序排列:Collections.sort(list);
倒序排列:list.sort(Comparator.revseOrder());
List< String>中保存的为成绩信息,对成绩信息进行求和计数等操作
IntSummaryStatistics stats = list.stream().mapToDouble((t)->t).summaryStatustics();
最大值:stats.getMax();
最小值:stats.getMin();
求和:stats.getSum();
平均数:stats.getAverage();
计数:stats.getCount();
toString():stats.toString();

通过复杂条件过滤 list 中的元素
需求:有一个用户信息 List< User>list 集合和一个 Id 集合 List< Integer>listInt,需要将在 list 中 id 在集合 listInt 中的对象去除:
//首先将 list 转成 id-entity 的键值对(id 不可能重复,所以不考虑键名重复的情况)
Map< Integer,User> map = list.stream().collect(Collectors.toMap(User::getId,t->t));
//得到键值集合
Set< Integer> ids = map.keySet();
//通过 set 的 contains()方法判定
for(Integer i:listInt){
if(ids.contains(i)){
list.remove(map.get(i));
}
}

参考资料:

JDK 1.8 Lambda 表达式集合分组、条件过滤、组装、去重、排序、转换、求和、最值
java8 list 求最大值、最小值、平均值、求和、中位数、属性排序、去重
Java8 函数式编程(三):Collectors.groupingBy
Java8-转为流为基本数据类型求最大值、最小值、平均值、求和、计数
java8 list 统计(求和、最大、最小、平均)


尽管叫我疯子 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Java 8 Lambda 表达式使用总结
喜欢 (2)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址