目录
Stream流简介
Stream流常用方法大全
forEach遍历
filter过滤
distinct去重
limit截取
skip跳过
sorted排序
max,min,count聚合
reduce统计
List结构转换Map结构
List对象转List
List对象转List
Stream流特点及优缺点
特点
优缺点
为了简化集合类操作,JDK1.8出现的一种操作——Stream流,其不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作。这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。Stream不保存数据,故每个Stream流只能使用一次。stream流的方法有很多中,大致分为延迟方法和终结方法:
终结方法,遍历之后就不能继续调用Stream流中的其他方法
public static void main(String[] args) {
//获取一个Stream流
Streamstream= Stream.of("张三","李四","王五","赵六");
//使用Stream流的方法forEach对stream流中的数据遍历
stream.forEach((String name)->{
System.out.println(name);
});
}
public static void main(String[] args) {
//创建一个Stream流
Stream stream = Stream.of("张三", "李四", "王五", "赵六1", "刘老七");
//单条件过滤
Stream stream1 = stream.filter((String name) -> {
return name.startsWith("刘");
});
//多条件过滤
List stream2 = stream.filter((String name) -> {
if(name.length()>=3 && name.equals("刘老七")){
return true;
}
return false;
}).collect(Collectors.toList);
//遍历stream1
stream1.forEach((name)-> System.out.println(name));
//输出stream2
System.out.println(stream2)
}
public static void main(String[] args) {
//创建一个Stream流
Stream stream = Stream.of("张三", "张三","张三","李四", "王五", "赵六1", "刘老七");
//去重
List stream1 = stream().distinct().collect(Collectors.toList());
//输出stream1
System.out.println(stream1)
}
limit(long maxSize);参数是一个long型,如果集合当前长度大于参数则进行截取,否则不进行操作
public static void main(String[] args) {
//创建一个Stream流
Stream stream = Stream.of("张三", "张三","张三","李四", "王五", "赵六1", "刘老七");
//去重
List list = stream().distinct().collect(Collectors.toList());
//截取去重后的前2个元素
list = list.stream().limit(2).collect(Collectors.toList();
//输出stream1
System.out.println(list)
}
skip(long n)如果流的当前长度大于n,则跳过前n个,否则将会得到一个长度为0的空流
public static void main(String[] args) {
//创建一个Stream流
Stream stream = Stream.of("张三", "张三","张三","李四", "王五", "赵六1", "刘老七");
//去重
List list = stream().distinct().collect(Collectors.toList());
//跳过去重后的前2个元素
list = list.stream().skip(2).collect(Collectors.toList());
//输出stream1
System.out.println(list)
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Test("张三",23,new BigDecimal("3000"),new BigDecimal("1.1")));
list.add(new Test("李四",24,new BigDecimal("2800"),new BigDecimal("1.2")));
list.add(new Test("王五",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//根据年龄从大到小排序
list = list.stream()
.sorted(Comparator.comparing(Test::getAge).reversed())
.collect(Collectors.toList());
list.forEach(System.out::println);
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add(new Test("张三",23,new BigDecimal("3000"),new BigDecimal("1.1")));
list.add(new Test("李四",24,new BigDecimal("2800"),new BigDecimal("1.2")));
list.add(new Test("王五",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//获取年龄最大的人
Test maxPeople = list.stream().max(Comparator.companing(Test::getAge)).get();
//获取年龄最小的人
Test minPeople = list.stream().min(Comparator.companing(Test::getAge)).get();
//获取数量
long count = list.stream().filter(x -> x > 5).count();
}
public static void main(String[] args) {
List testList = new ArrayList();
testList.add(new Test("小明",23,new BigDecimal("3000"),new BigDecimal("1.1")));
testList.add(new Test("小红",24,new BigDecimal("2800"),new BigDecimal("1.2")));
testList.add(new Test("小兰",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//统计年龄总和
int totalAge =testList.stream().mapToInt(Test::getAge).sum();
//统计工资总和
BigDecimal totalSalary = testList.stream().map(Test::getSalary)
//统计工资乘以各自系数的总和(向上保留两位)
BigDecimal totalRatioSalary = testList.stream()
.map(s->s.getSalary()
.multiply(s.getRatio())
.setScale(2,BigDecimal.ROUND_HALF_UP))
.reduce(BigDecimal.ZERO,BigDecimal::add);
}
public static void main(String[] args) {
List testList = new ArrayList();
testList.add(new Test("张三",23,new BigDecimal("3000"),new BigDecimal("1.1")));
testList.add(new Test("李四",24,new BigDecimal("2800"),new BigDecimal("1.2")));
testList.add(new Test("王五",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//根据姓名转map,map的key为name
Map nameMap= testList.stream().collect(Collectors.toMap(Test::getName, Test -> Test);
System.out.println(map);
}
public static void main(String[] args) {
List testList = new ArrayList();
testList.add(new Test("张三",23,new BigDecimal("3000"),new BigDecimal("1.1")));
testList.add(new Test("李四",24,new BigDecimal("2800"),new BigDecimal("1.2")));
testList.add(new Test("王五",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//获取姓名集合
List nameList = testList.stream().map(Test::getName()).collect(Collectors.toList());
System.out.println("value:"+nameList);
}
public static void main(String[] args) {
List peopleList = new ArrayList();
peopleList.add(new People("张三",23,new BigDecimal("3000"),new BigDecimal("1.1")));
peopleList.add(new People("李四",24,new BigDecimal("2800"),new BigDecimal("1.2")));
peopleList.add(new People("王五",22,new BigDecimal("3200"),new BigDecimal("1.3")));
//对象转对象
List studentList = peopleList.stream().map(s->{
return new Student(s.getName(),s.getAge());
}).collect(Collectors.toList());
System.out.println("value:"+studentList);
}
优点:
缺点: