写在开始:一个搬砖程序员的随缘记录
Stream介绍
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。
一、基本操作
List<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("王五");
list.add("王五");
1.去重、去重后数量
//去重
List<String> collect = list.stream().distinct().collect(Collectors.toList());
log.info("list:" + collect);
//去重后统计数量
long distinctCount = list.stream().distinct().count();
log.info("distinctCount:" + distinctCount);
结果:
list:[张三, 李四, 王五]
distinctCount:3
2.转换
//List转数组
String[] str = list.stream().toArray(String[]::new);
log.info("str:" + Arrays.toString(str));
//逗号隔开
String split = list.stream().collect(Collectors.joining(",")).toString();
log.info("split:" + split);
结果
str:[张三, 李四, 王五, 王五]
split:张三,李四,王五,王五
3.List String转List Date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
List<String> dateList = new ArrayList<>();
dateList.add("2020/11/16");
dateList.add("2020/11/17");
dateList.add("2020/11/18");
List<Date> collectList = dateList.stream().map(b -> {
try {
return sdf.parse(b);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
//String[]转List<Date>
String[] dates = {"2020/11/16", "2020/11/17", "2020/11/18"};
List<Date> collectList1 = Arrays.stream(dates).map(b -> {
try {
return sdf.parse(b);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}).collect(Collectors.toList());
4.过滤
//筛选包含五的数据
List<String> containsList = list.stream().filter(e -> e.contains("五")).collect(Collectors.toList());
log.info("containsList:" + containsList);
结果
containsList: [王五,王五]
5.匹配
anyMatch(),只要有一个元素匹配传入的条件,就返回 true。
allMatch(),只有有一个元素不匹配传入的条件,就返回 false;如果全部匹配,则返回 true。
noneMatch(),只要有一个元素匹配传入的条件,就返回 false;如果全部不匹配,则返回 true。
//如果其中有一个字符串包含五的则返回true,反之false
boolean b = list.stream().anyMatch(e -> e.contains("王"));
//如果所有的字符串长度大于2的则返回true,反之ffalse
boolean b1 = list.stream().allMatch(e -> e.length() > 2);
//如果字符串没有为赵六的则返回true,反之返回false
boolean b2 = list.stream().noneMatch(e -> e.equals("赵六"));
log.info("b:" + b);
log.info("b1:" + b1);
log.info("b2:" + b2);
结果:
b:true
b1:false
b2:true
5.运算
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
//List值相加
Integer i = list.stream().reduce(Integer::sum).orElse(0);
//List值相加+1
Integer i1 = list.stream().reduce(1, Integer::sum);
log.info("i:" + i);
log.info("i1:" + i1);
结果:
i:15
i1:16
6.分割值
List<String> list = new ArrayList<>();
list.add("1,2,3");
list.add("4,5,6");
list.add("7,8,9");
List<String> splitList = list.stream().map(s -> s.split(",")).flatMap(Arrays::stream).collect(Collectors.toList());
log.info("splitList:" + splitList);
结果:
splitList:[1, 2, 3, 4, 5, 6, 7, 8, 9]
二、实体类+List操作
实体类+List
package demo;
import lombok.Data;
/**
* @author demo
* @date 2020/11/6 11:15
*/
@Data
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
List<Person> list = new ArrayList<>();
list.add(new Person("张三", 15));
list.add(new Person("李四", 10));
list.add(new Person("王五", 20));
1.提取Person属性List集合
//提取nameList
List<String> nameList = list.stream().map(Person::getName).collect(Collectors.toList());
log.info("nameList:" + nameList);
//保留年龄大于15的值
List<Person> isAgeList = list.stream().filter(person -> person.getAge() > 15).collect(Collectors.toList());
log.info("isAgeList:" + isAgeList);
//根据年龄大小排序
List<Person> sortAgeList = list.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
log.info("sortAgeList:" + sortAgeList);
//取List第一条数据
List<Person> limitList = list.stream().limit(1).collect(Collectors.toList());
log.info("limitList:" + limitList);
//剔除前面2条数据后的数据
List<Person> skipList = list.stream().skip(2).collect(Collectors.toList());
log.info("skipList:" + skipList);
//年龄相加
Integer i = list.stream().map(Person::getAge).reduce(0, Integer::sum);
log.info("i:" + i);
//max,min,sum,avg,count
IntSummaryStatistics intSummaryStatistics = list.stream().mapToInt(person -> person.getAge()).summaryStatistics();
//求和
long sum = intSummaryStatistics.getSum();
//平均数
double average = intSummaryStatistics.getAverage();
//最大
int max = intSummaryStatistics.getMax();
//最小
int min = intSummaryStatistics.getMin();
//统计条数
long count = intSummaryStatistics.getCount();
log.info("年龄相加:" + sum);
log.info("平均年龄:" + average);
log.info("最大年龄:" + max);
log.info("最小年龄:" + min);
log.info("总数量:" + count);
结果:
nameList:[张三, 李四, 王五]
isAgeList:[Person(name=王五, age=20)]
sortAgeList:[Person(name=李四, age=10), Person(name=张三, age=15), Person(name=王五, age=20)]
limitList:[Person(name=张三, age=15)]
skipList:[Person(name=王五, age=20)]
i:45
年龄相加:45
平均年龄:15.0
最大年龄:20
最小年龄:10
总数量:3
Over