Java8 List的Stream流总结

写在开始:一个搬砖程序员的随缘记录

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值