首页 > 编程语言 >Java8之list.stream的常见使用

Java8之list.stream的常见使用

时间:2022-09-21 14:44:06浏览次数:73  
标签:map stream List list collect Student Java8

List<Integer> list = new ArrayList<Integer>();

从小到大方法:

Collections.sort(list);

从大到小方法:

Collections.sort(list,Collections.reverseOrder());

stream获取list中的某个元素集合:
List<Integer> ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());

遇到数据的字段为null的元素,需要进行特殊处理下:

List<Integer> ages=studentList.stream().map(s -> s.getAge() == null ? "" : s.getAge()).collect(Collectors.toList());

ages.removeAll(Collectors.singleton(""));

这样就可以了~

上面的例子只是从学生集合中提取年龄,如果操作复杂一点,比如以班级为单位,提取所有班级下的所有学生的年龄(Dto<List<Student>>类型)以分析学生的年龄分布曲线。这时我们使用上面的方法还行得通吗?

List<Student> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());

通过上面的一顿操作,我们只能得到每个班的学生集合。 我们还需要嵌套循环才能获取学生的年龄数据,十分不便。如果我们能返回全部学生的集合 List 就方便多了。

使用flatMap 提取 List map 提取年龄:
List ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());

stream对集合去重:
List<Integer> ages= list.stream().map(A::getAge).distinct().collect(Collectors.toList());

stream根据某个字段对集合去重:

List<User> res = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User:: getName))), ArrayList::new));

计算List对象中某个字段值的总和:

int total = list.stream().mapToInt(User::getAge).sum();

将List转换为用逗号隔开的字符串:

String str = list.stream().map(String::valueOf).collect(Collectors.joining(","));

将List转Map

Map<String, String> map = list.stream().collect(Collectors.toMap(User::getId(), User::getName()));

Map<String, Object> map = list.stream().collect(Collectors.toMap(User::getId(), t -> t));

List根据字段分组

Map<String, List<User>> resultList = userList.stream().collect(Collectors.groupingBy(User::getId));

filter根据某个属性值获取到该对象

Optional<User> first = userList.stream().filter(user -> Objects.equals(user.getId(),1)).findFirst();

if(first.isPresent()) { //判空

System.out.println(first.get());

}

filter过滤某个字段的值

List<User> list = userList.stream().filter(u -> "男".equals(User::getSex)).collect(Collectors.toList());

注:

removeIf中的test方法返回true代表当前元素会被过滤掉;(list.removeIf())

filter中的test方法返回true代表当前元素会保留下来。(list.stream().filter())

举例2:

public static void main(String[] args) {
List<Student> list = Lists.newArrayList();
list.add(new Student("测试", "男", 18));
list.add(new Student("开发", "男", 20));
list.add(new Student("运维", "女", 19));
list.add(new Student("DBA", "女", 22));
list.add(new Student("运营", "男", 24));
list.add(new Student("产品", "女", 21));
list.add(new Student("经理", "女", 25));
list.add(new Student("产品", "女", 21));

//求性别为男的学生集合
List<Student> l1 = list.stream().filter(student -> student.sex.equals("男")).collect(toList());

//map的key值true为男,false为女的集合
Map<Boolean, List<Student>> map = list.stream().collect(partitioningBy(student -> student.getSex().equals("男")));

//求性别为男的学生总岁数
Integer sum = list.stream().filter(student -> student.sex.equals("男")).mapToInt(Student::getAge).sum();

//按性别进行分组统计人数
Map<String, Integer> map = list.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.summingInt(p -> 1)));

//判断是否有年龄大于25岁的学生
boolean check = list.stream().anyMatch(student -> student.getAge() > 25);

//获取所有学生的姓名集合
List<String> l2 = list.stream().map(Student::getName).collect(toList());

//求所有人的平均年龄
double avg = list.stream().collect(averagingInt(Student::getAge));

//求年龄最大的学生
Student s = list.stream().reduce((student, student2) -> student.getAge() > student2.getAge() ? student:student2).get();

Student stu = list.stream().collect(maxBy(Comparator.comparing(Student::getAge))).get();

//按照年龄从小到大排序
List<Student> l3 = list.stream().sorted((s1, s2) -> s1.getAge().compareTo(s2.getAge())).collect(toList());

//求年龄最小的两个学生
List<Student> l4 = l3.stream().limit(2).collect(toList());

//获取所有的名字,组成一条语句
String str = list.stream().map(Student::getName).collect(Collectors.joining(",", "[", "]"));

//获取年龄的最大值、最小值、平均值、求和等等
IntSummaryStatistics intSummaryStatistics = list.stream().mapToInt(Student::getAge).summaryStatistics();
System.out.println(intSummaryStatistics.getMax());
System.out.println(intSummaryStatistics.getCount());
}

@Data
@AllArgsConstructor
static class Student{
String name;
String sex;
Integer age;
}

三、总结
(1) list.stream().map().collect()方法,可以获取list中JavaBean的某个字段,转成一个新的list。

(2) list.stream().filter().map().collect()方法,可以对list中的JavaBean进行筛选,保留符合条件的JavaBean,然后将JavaBean中的某个字段,转成一个新的list。

(3) list.stream().collect()方法,可以把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)

(4) list.stream().filter().collect()方法,可以先筛选出list中符合条件的JavaBean,然后把list转为map,可以指定list的中的JavaBean的某个字段或JavaBean本身为map的key或value。(或者根据情况自定义map的key与value)

标签:map,stream,List,list,collect,Student,Java8
From: https://www.cnblogs.com/liupj/p/16715534.html

相关文章

  • otdolist 案例
    1.渲染默认任务  2.回车添加任务 3.删除任务  4.底部任务数量 5. tab栏切换  6.tab切换显示不同任务  7.清除已完成的任务  8.......
  • Java8 Stream使用汇总总结
    前言:近期在coding过程中经常使用到java8的Stream,故在此做个汇总总结,积累沉淀下常用方法,希望对读的人也有所帮助,下一篇总结下lambda。文章目录Java8Stream1Stream概......
  • 探索Java8:(五)Supplier和Consumer接口的使用
    Supplier是函数式编程的另一个接口,与Function、Predicate接口类似,区别在于Supplier不接收任何参数,只返回结果。Supplier的基本使用@FunctionalInterfacepublicinterfac......
  • df.values.tolist()
     在Python数据分析中,Pandas的DataFrame和list数据类型之间可以相互转换。1.1df.values.tolist():可以将DataFrame数据类型转化为list数据类型;1.2pd.DataFrame():......
  • python经典题目:list1=[1,2,3,4,5] 一行代码取出比4大的元素【杭州多测师】【杭州多测
    #list1=[1,2,3,4,5]#一行代码取出比4大的元素print([iforiin[1,2,3,4,5]ifi>4]) #输入一串字符串、如果有重复的字符打印第一次出现的字符、否则打印no......
  • java 根据任意List<Object>输出excel表格
    使用方法:将自定义的pojo类,添加到list中,直接调用输出类的out方法就可以(注意:这个pojo类的属性上必须使用自定义注解,index属性用来标识该属性放在哪一列,value则标示输出的中......
  • jdk 1.8 处理 map和list
    1.map的key和value反转  2.list<Object>取两列转成 map<String,String>map  3.list<Object>转成map集合 map<String,list<Object>>map集合......
  • List与Set 介绍
    这是Collection的关系图(比较着网上画的)Set与List分别是Colleraction的子接口,而它们也有一些子类和接口Set:HashSet:底层使用的数据结构:HashMap哈希表存储结构......
  • java-stream-函数式接口
    一、概述java是面向对象的,对象往往映射现实生活中的某个具体的东西,绝大多数保存在java内存的堆中;java的函数式编程,则可以将对象指向一个函数(行为),而非具体的东西;函数式接......
  • ArrayList扩容代码分析
    ArrayList扩容机制是在面试中频繁出现的问题,平时了解的比较含糊,特此记录!注意:每次发生扩容,其容量扩充为原来的1.5倍左右,详见grow方法常量//默认容量privatestaticfin......