java8的.stream()

.stream()

stream()是Java8中引入的流(Stream)的操作方法。通过使用流,可以对集合数据进行过滤、映射、排序、聚合等操作。
集合数据通过管道流处理之后,转化为另一组集合或数据输出。

.filter()

一般适用于list集合,从集合中筛选出想要的数据。

List<StudentDto> studList=list.stream().filter(s->"女".equals(s.getGender())).collect(Collectors.toList());
 System.out.println(studList);

解释:从list中筛选出性别为女的学生信息集合。
运行结果:在这里插入图片描述

.findAny()

表示将其中任意一个返回。

StudentDto student=list.stream().filter(s->"女".equals(s.getGender())).findAny().orElse(null);
System.out.println(student);

解释:
s代表list中一个学生;
.filter(s->“女”.equals(s.getGender()))表示过滤出list中性别为女的学生;
.findAny().orElse(null)表示将其中任意一个返回;如果没找到,返回null。
将findAny与orElse连用规避空指针的问题
运行结果:在这里插入图片描述

.orElse(null)

如果没找到,返回null。
orElse()中可以塞默认值。如果找不到就会返回orElse中你自己设置的默认值。
还可这样写:

StudentDto student4=list.stream().filter(s->"女".equals(s.getGender())).findFirst().orElse(new StudentDto());

运行结果:
在这里插入图片描述

.findFirst()

用于找到第一次出现的元素

StudentDto student2=list.stream().filter(s->"女".equals(s.getGender())).findFirst().orElse(null);
System.out.println(student2);

将findFirst与orElse连用规避空指针的问题
运行结果:在这里插入图片描述

.findFirst()和.findAny()区别

1.findFirst() : 返回流中的第一个元素;如果流是空的,则返回空;
2.findAny() : 返回流中的任意一个元素;如果流是空的,则返回空;
【多数情况下,数据量不大的情况下,findAny()也会返回第一个元素,此时效果与findFirst()一致】

Optional<T> ,可以通过该类型对象的 get()方法获取内部包含的值。
 Optional<StudentDto> student3=list.stream().filter(s->"女".equals(s.getGender())).findFirst();
        if(student3.isPresent()){   // 如果不是空
            System.out.println(student3.get());  
        }

运行结果:
在这里插入图片描述

.sorted()

用于对流进行排序。
1、根据分数升序排。

List<StudentDto> studList2 = list.stream().sorted(Comparator.comparing(StudentDto::getTotalScore)).collect(Collectors.toList());
System.out.println(studList2);

2、根据分数降序排。

List<StudentDto> studList3 = list.stream().sorted(Comparator.comparing(StudentDto::getTotalScore).reversed()).collect(Collectors.toList());
System.out.println(studList3);

3、先根据分数升序排,如果分数相同,根据年龄升序排
多字段排序

List<StudentDto> studList5 = list.stream().sorted(Comparator.comparing(StudentDto::getTotalScore).thenComparing(StudentDto::getAge)).collect(Collectors.toList());
System.out.println(studList5);

运行结果:
在这里插入图片描述

.map()

用于对流中的元素进行映射转换操作

//取学生名称

List<String> userNames = list.stream().map(StudentDto::getUserName).collect(Collectors.toList());
System.out.println(userNames);

//学生总分+10分

List<StudentDto> roundBidList;
roundBidList = list.stream().map(item->{
	item.setTotalScore(String.valueOf(Integer.valueOf(item.getTotalScore())+10));
	return item;
}).collect(Collectors.toList());
System.out.println(roundBidList);

运行结果:
在这里插入图片描述

.collect()

收集流中数据到新集合中。
1.收集流数据到 list

List<String> list1 = list.stream().map(StudentDto::getTotalScore).collect(Collectors.toList());
System.out.println(list1);

2.收集流数据到 set(不重复)

Set<String> set2 = list.stream().map(StudentDto::getTotalScore).collect(Collectors.toSet());
System.out.println(set2);

3.收集流数据到指定的集合中

ArrayList<String> arrayList = list.stream().map(StudentDto::getTotalScore).collect(Collectors.toCollection(ArrayList::new));
System.out.println(arrayList);

4、收集流数据到新map集合中(p-> p是用来返回自己本身的lambda表达式)

Map<String, StudentDto> sutdentMap =
list.stream().filter(p -> Integer.valueOf(p.getTotalScore()) > 290).collect(Collectors.toMap(StudentDto::getUserCode,p -> p));
System.out.println(sutdentMap);

5、收集流数据到新map集合中
Function.identity()替代p -> p形式的Lambda表达式(相同含义)。
但有些时候不能完全替代。

Map<String, StudentDto> sutdentMap2 = 
list.stream().filter(p -> Integer.valueOf(p.getTotalScore()) > 290).collect(Collectors.toMap(StudentDto::getUserCode, Function.identity()));
System.out.println(sutdentMap2);

运行结果:
在这里插入图片描述

.collect(Collectors.joining())

用于在流操作中将元素按照指定的分隔符连接成一个字符串。

Collectors.joining():将所有元素连接成一个字符串,默认使用空字符串作为分隔符。
Collectors.joining(分隔符):使用指定的分隔符将元素连接成一个字符串。
Collectors.joining(分隔符,前缀 ,后缀):使用指定的分隔符、前缀和后缀将元素连接成一个字符串。

String result = list.stream().map(StudentDto::getUserCode).collect(Collectors.joining(","));
        System.out.println(result);

运行结果:
在这里插入图片描述

.distinct()

去重
1、将list去重

System.out.println("list去重复前"+list);
List<StudentDto> list2=list.stream().distinct().collect(Collectors.toList());
System.out.println("list去重复后"+list);

2、将scores去重

List<String> scores = list.stream().map(StudentDto::getTotalScore).collect(Collectors.toList());
System.out.println("scores去重复前"+scores);
scores = scores.stream().distinct().collect(Collectors.toList());
System.out.println("scores去重复后"+scores);

运行结果:
在这里插入图片描述

Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(g…

使用TreeSet不可重复特性去重复。
//根据年级、分数去重

List<StudentDto> distinctList = list.stream().collect(
		Collectors.collectingAndThen(
				Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getGrade() + o.getTotalScore()))), ArrayList::new));
System.out.println(distinctList);

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值