一些常用的Stream流和Lambda表达式的结合

一.将一个对象集合中的某个属性转换为一个集合

List propertyList = DOList.stream().map(DO::getProperty).collect(Collectors.toList());

1.如果获取的属性需要进行类型转换

例:List propertyList = DOList.stream( ).map(v -> Integer.valueOf(v.getProperty())).collect(Collectors.toList());

2.如果在进行类型转换时有空值则会报错(需排除空值)
(以String类型转换为Integer为例,map和 filter可以视情况交换使用顺序)

例:List propertyList= DOList.stream()
                .filter(v -> v.getProperty() != null && !"".equals(v.getProperty ()))
                .map(v -> Integer.valueOf(v.getProperty()))
                .collect(Collectors.toList());

3.转换集合时只保留另外一个集合(list)中存在的值

例:List propertyList = DOList.stream()
                .filter(v -> list.contains(v.getProperty()))
                .map(v -> Integer.valueOf(v.getProperty()))
                .collect(Collectors.toList());

4.将一个集合转换成字符串用","隔开

例:String string = list.stream().collect(Collectors.joining(","));
(如果是转换对象集合中的一个属性,则可以使用map映射到这个属性再collect)

二.将一个对象集合的属性和对象自身转换为一个Map集合

注:(Function.identity() 可替换为 x -> x)

例:Map DOMap = DOList.stream().collect(Collectors.toMap(DO::getProperty, Function.identity()));

1.当集合(DOList)中存在重复值,转换为Map时会因为key重复而报错:Duplicate key(解决方法:合并key)

1.用后面的 value 覆盖前面的 value
例:Map DOMap = DOList.stream().collect(Collectors.toMap(DO::getProperty, Function.identity(), (k1,k2) -> k2));

2.将前面的 value 和后面的value拼接起来
例:Map propertyMap = DOList.stream().collect(Collectors.toMap(DO::getProperty1, DO::getProperty2, (k1,k2) -> k1+","+k2));

3.合并 list 集合为一个集合
例:Map> listMap = DOList.stream().collect(Collectors.toMap(DO::getProperty, DO::getList, (List list1,List list2) -> {list1.addAll(list2);return list1;}));

4.合并 指定属性值 为一个集合
Map> listMap = 
DOList.stream().collect(Collectors.groupingBy(DO::getProperty1, Collectors.mapping(DO::getProperty2, Collectors.toList())));

2.当需要根据集合(DOList)中某个属性进行分组时,可以使用 Collectors.groupingBy()

1.Collectors.groupingBy() 可以嵌套使用
例:Map>> DOMap = DOList.stream()
                    .collect(Collectors.groupingBy(DO::getProperty1,
                            Collectors.groupingBy(DO::getProperty2)));

2.Collectors.groupingBy() 可以和 Collectors.toMap() 结合使用
例:Map> DOMap = DOList.stream()
                    .collect(Collectors.groupingBy(DO::getProperty1,
                            Collectors.toMap(DO::getProperty2, DO::getProperty3,
                                    (k1, k2) -> new BigDecimal(k1).add(new BigDecimal(k2)).toString())));


3.对象集合根据某个属性分组的map根据键值进行排序
List>> sectionDOList = DOMap.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList());

三.对象集合中某一属性相关统计(求和、最大、最小、平均)

1.求和
double sum = DOList.stream().mapToDouble(DO::getProperty).sum();
2.最大值
double max = DOList.stream().mapToDouble(DO::getProperty).max();
3.最小值
double min = DOList.stream().mapToDouble(DO::getProperty).min();
4.平均值
double ave = DOList.stream().mapToDouble(DO::getProperty).average();

#注:除了 mapToDouble(),还有 mapToInt ()、mapToLong();

1.遇到统计 BigDecimal 类型的数据

1.求和
BigDecimal sum = DOList.stream().map(DO::getProperty).reduce(BigDecimal.ZERO, BigDecimal::add);
2.最大值
BigDecimal max = DOList.stream().map(DO::getProperty).max(BigDecimal::compareTo).get();
3.求最小值
BigDecimal min = DOList.stream().map(DO::getProperty).min(BigDecimal::compareTo).get();
4.求平均值
BigDecimal ave = DOList.stream().map(User::getProperty).reduce(BigDecimal.ZERO, BigDecimal::add).divide(BigDecimal.valueOf(DOList.size()), 2, BigDecimal.ROUND_HALF_UP);

四.Stream流使用

1.筛选

  • filter(boolean):过滤(boolean为true时往后执行);
  • distinct():去重;
  • limit(n):截短流(只获取符合条件的 n 条数据);
  • skip(n):跳过元素(跳过满足条件的前 n 条数据);

2.映射

  • map:将一个类型元素转为另一个类型的元素;
  • flatMap:把一种流转成另一种流,并将转换后的流合并成一个流;

3.查找和匹配

  • allMatch(boolean):是否匹配所有元素;
  • anyMatch(boolean):是否匹配至少一个元素;
  • noneMatch(boolean):是否没有任何元素匹配;
  • findFirst():返回流中的第一个元素;
  • findAny():返回流中的任意一个元素;
  • reduce(a, b):a(是总变量的初始值),b(函数式接口的实现类,一般使用Lambda表达式);

4.改变内部元素

  • peek():可用于修改集合中的属性,可用于输出信息

五. 根据对象集合中的某个属性对这个集合进行"排序/去重"

1. 排序
sorted():它使用自然顺序对流的元素进行排序。元素类必须实现Comparable接口

集合排序
1_1 集合升序排序
list.stream().sorted().collect(Collectors.toList());
1_2 集合降序排序,自然序降序使用Comparator提供reverseOrder()方法
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

对象集合排序
2_1 对象集合按某一属性升序排序
DOList.stream().sorted(Comparator.comparing(DO::getProperty)).collect(Collectors.toList());
2_2 对象集合按某一属性降序排序,使用Comparator提供reversed()方法
DOList.stream().sorted(Comparator.comparing(DO::getProperty).reversed()).collect(Collectors.toList());

附加:
对象集合根据某个属性排序(属性为字符串类型数值)
3_1 正序
DOList.sort((o1, o2) -> Integer.compare(Integer.valueOf(o1.getProperty()), Integer.valueOf(o2.getProperty())));
3_2 倒叙
DOList.sort((o1, o2) -> -1 * Integer.compare(Integer.valueOf(o1.getProperty()), Integer.valueOf(o2.getProperty())));

2. 去重
使用Comparator.comparing获取到指定去重属性,TreeSet实现去重
注:Comparator还有"comparingInt()"、"comparingLong()"、"comparingDouble()"

ArrayList::new用来转换结果为List集合
List DODistinctList = DOList.stream()
        .collect(Collectors.collectingAndThen(Collectors.toCollection(
                () -> new TreeSet<>(Comparator.comparing(DO::getProperty))), ArrayList::new));

也可以直接去重之后转化为Set
Set DOSet = DOList.stream().collect(Collectors.toCollection(
        () -> new TreeSet<>(Comparator.comparing(DO::getProperty))));

你可能感兴趣的:(一些常用的Stream流和Lambda表达式的结合)