主要介绍操作两种类型List<Integer>以及List<Person>,使用steam流可使实现功能代码更加简洁,下面都是实战项目中常用的几种操作
示例数据初始化
/**
* 初始示例数据
* List<Integer>
* List<Person>
*/
private static List<Integer> numList = new ArrayList<>(4);
private static List<Person> personList = new ArrayList<>(4);
@Getter
@Setter
@ToString
static class Person {
private String name;
private int age;
private String dept;
Person(String name, int age, String dept) {
this.name = name;
this.age = age;
this.dept = dept;
}
}
static {
numList.add(1);
numList.add(2);
numList.add(3);
numList.add(3);
personList.add(new Person("老王", 11, "开发部"));
personList.add(new Person("老老王王", 11, "开发部"));
personList.add(new Person("老李", 12, "开发部"));
personList.add(new Person("老张", 13, "产品部"));
}
一、使用stream流对List<Integer>进行去重,求和,大小值,过滤,排序,平均值
1.1 去重
/**
* 去重
* params List<Integer>
*/
@Test
public void streamTest_1() {
List<Integer> result = numList.stream().distinct().collect(Collectors.toList());
result.forEach(System.out::println);
}
输出结果:
1
2
3
1.2 求和
/**
* 求和
* params List<Integer>
*/
@Test
public void streamTest_2() {
long result = numList.stream().mapToInt(value -> value).sum();
System.out.println(result);
}
输出结果:
9
1.3 最大值
/**
* 最大
* params List<Integer>
*
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_3() {
Optional<Integer> max = numList.stream().max(Comparator.comparing(value -> value));
if(max.isPresent()){
int result = max.get();
System.out.println(result);
}
}
输出结果:
3
1.4 最小值
/**
* 最小
* params List<Integer>
*
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_4() {
Optional<Integer> min = numList.stream().min(Comparator.comparing(value -> value));
if(min.isPresent()){
int result = min.get();
System.out.println(result);
}
}
输出结果:
1
1.5 过滤
/**
* 过滤
* params List<Integer>
*
* 条件 将3的元素筛选出来
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_5() {
List<Integer> result = numList.stream().filter(value -> value == 3).collect(Collectors.toList());
System.out.println(result);
}
输出结果:
[3, 3]
1.6 排序(从小到大)
/**
* 排序
* params List<Integer>
*
* 条件 从小到大
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_6() {
List<Integer> result = numList.stream()
.sorted(Comparator.comparing(value -> value)).collect(Collectors.toList());
System.out.println(result);
}
输出结果:
[1, 2, 3, 3]
1.7 排序(从大到小)
/**
* 排序
* params List<Integer>
*
* 条件 从大到小
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_7() {
List<Integer> result = numList.stream()
.sorted(Comparator.comparing(value -> value,Comparator.reverseOrder())).collect(Collectors.toList());
System.out.println(result);
}
输出结果:
[3, 3, 2, 1]
1.8 求平均值
/**
* 求平均值
* params List<Integer>
*/
@Test
public void streamTest_8() {
OptionalDouble average = numList.stream().mapToInt(value -> value).average();
if (average.isPresent()){
System.out.println(average.getAsDouble());
}
}
输出结果:
2.25
二、使用stream流对List<Person>进行去重,求和,大小值,过滤,排序,平均值,分组
2.1 去重(单属性)
/**
* 去重
* params List<Person>
* 条件 去除dept相同的
*
* Collectors.collectingAndThen 转换结果返回类型
* TreeSet 包含有序的且没有重复元素的集合
*
*/
@Test
public void streamTest_9() {
System.out.println("处理前:");
personList.forEach(System.out::println);
List<Person> result = personList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(
Person::getDept))), ArrayList::new));
//输出结果
System.out.println("处理后:");
result.forEach(System.out::println);
}
输出结果:
处理前:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
处理后:
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
2.2 去重(多属性)
/**
* 去重
* params List<Person>
* 条件 去除age且dept相同的
*
*/
@Test
public void streamTest_10() {
System.out.println("处理前:");
personList.forEach(System.out::println);
List<Person> result = personList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(
Comparator.comparing(person -> person.getAge() + "," + person.getDept()))), ArrayList::new));
//输出结果
System.out.println("处理后:");
result.forEach(System.out::println);
}
输出结果:
处理前:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
处理后:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
2.3 求和
/**
* 求和
* params List<Person>
* 条件 age总和
*
*/
@Test
public void streamTest_11() {
int sum = personList.stream().mapToInt(Person::getAge).sum();
System.out.println(sum);
}
输出结果:
47
2.4 最大
/**
* 最大
* params List<Person>
* 条件 age最大
*
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_12() {
Optional<Person> personOptional = personList.stream().max(Comparator.comparing(Person::getAge));
personOptional.ifPresent(person -> System.out.println(person.toString()));
}
输出结果:
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
2.5 最小
/**
* 最小
* params List<Person>
* 条件 age最小
*
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_13() {
Optional<Person> personOptional = personList.stream().min(Comparator.comparing(Person::getAge));
personOptional.ifPresent(person -> System.out.println(person.toString()));
}
输出结果:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
2.6 过滤
/**
* 过滤
* params List<Person>
* 条件 筛选age等于11的数据
*
*/
@Test
public void streamTest_14() {
List<Person> result = personList.stream().filter(person -> person.getAge() == 11).collect(Collectors.toList());
result.forEach(System.out::println);
}
输出结果:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
2.7 排序(从小到大)
/**
* 排序
* params List<Person>
*
* 条件 按age从小到大
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_15() {
List<Person> result = personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
result.forEach(System.out::println);
}
输出结果:
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
2.8 排序(从大到小)
/**
* 排序
* params List<Person>
*
* 条件 按age从大到小
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_16() {
List<Person> result
= personList.stream().sorted(Comparator.comparing(Person::getAge,Comparator.reverseOrder())).collect(Collectors.toList());
result.forEach(System.out::println);
}
输出结果:
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
2.9 排序(多字段排序)
/**
* 多字段排序
* params List<Person>
*
* 条件 先按age从大到小,再按dept从大到小
* Comparator.comparing 元素为null会抛出异常
*/
@Test
public void streamTest_17() {
List<Person> result
= personList.stream().sorted(Comparator
.comparing(Person::getAge,Comparator.reverseOrder())
.thenComparing(Person::getDept,Comparator.reverseOrder())).collect(Collectors.toList());
result.forEach(System.out::println);
}
输出结果:
GoodsQueryTest.Person(name=老张, age=13, dept=产品部)
GoodsQueryTest.Person(name=老李, age=12, dept=开发部)
GoodsQueryTest.Person(name=老王, age=11, dept=开发部)
GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)
2.10 平均值
/**
* 平均值
* params List<Person>
*
* 条件 按age求平均值
*/
@Test
public void streamTest_18() {
OptionalDouble average = personList.stream().mapToInt(Person::getAge).average();
if(average.isPresent()){
System.out.println(average.getAsDouble());
}
}
输出结果:
11.75
2.11 分组
/**
* 分组
* params List<Person>
*
* 条件 age相同的分组(以age为key,分组记录为value)
*/
@Test
public void streamTest_19() {
Map<Integer, List<Person>> result = personList.stream().collect(Collectors.groupingBy(Person::getAge));
// for (Map.Entry<Integer, List<Person>> integerListEntry : result.entrySet()) {
// Integer key = integerListEntry.getKey();
// List<Person> value = integerListEntry.getValue();
// System.out.println(key + ": " + value);
// }
//上面输出可简写如下:
result.forEach((key, value) -> System.out.println(key + " : " + value));
}
输出结果:
11: [GoodsQueryTest.Person(name=老王, age=11, dept=开发部), GoodsQueryTest.Person(name=老老王王, age=11, dept=开发部)]
12: [GoodsQueryTest.Person(name=老李, age=12, dept=开发部)]
13: [GoodsQueryTest.Person(name=老张, age=13, dept=产品部)]
----------------- 文章如有问题,请下方回复指出,感谢查阅😁 -----------------