【jdk8之"流"金岁月】

水流点滴,让人激起无限遐想:
 
兵无常势,水无常形,他时而像一个沙场名将,在风云变幻的疆场,挥洒诡谲的战术;
 
乱石穿空,惊涛拍岸,卷起千堆雪,他时而像一个宿命诗人,面对万里河山,笔下涌出一段段华丽的文章;
 
才饮长沙水,又食武昌鱼。万里长江横渡,极目楚天舒。他又时而像一个胸怀丘壑,腹有良策的革命家,在纷繁复杂的乱境中,表现的豪迈而从容。
 
最喜小儿亡赖,溪头卧剥莲蓬,他时而又像一个顽皮的精灵,此刻又化身stream来到我们有趣的代码世界。
 
一、前言
Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以 执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。
 
二、流
VO代码
/**
 * 用户实体类
 *
 */
@Setter
@Getter
@ToString
public class UserVO {
    private String userName;//名称
    private Integer age;//年龄
    public UserVO() {
    }
    public UserVO(String userName, Integer age) {
        this.userName = userName;
        this.age = age;
    }
}
empty
empty()方法用来创建一个空的流
//empty()方法用来创建一个空的流
  Stream<String> stream = Stream.empty();
  stream.forEach(System.out::println);
filter
filter:过滤器,筛选符合条件的数据
// 筛选出年龄大于10的用户人数
count = dataList.stream().filter(p -> p.getAge() > 10 ).count();
System.out.println("年龄大于10的人数=" + count);

map

map:映射,他将原集合映射成为新的集合。原集合就是VO集合,新集合可以自定义映射为某一个字段的数据集合,同时也可以对新集合进行相关操作。
//获取所有用户的年龄集合
List<Integer> userAgeList = dataList.stream().map(p -> p.getAge()).collect(Collectors.toList());

sorted

sorted:排序,可以根据指定的字段进行排序
// 按用户年龄逆序排序
resultList = dataList.stream().filter(p -> p.getAge() > 0 ).sorted(Comparator.comparing(UserVO::getAge).reversed()).collect(Collectors.toList());

forEach

forEach:操作修改集合中的每一个元素
resultList.forEach(new Consumer<UserVO>() {
            @Override
            public void accept(UserVO userVO) {
                System.out.println("输出用户年龄=" + userVO.getAge());
            }
        });

collect

collect:聚合,可以用于GroudBy按指定字段分类,也可以用于返回列表或者拼凑字符串
// 按年龄进行归集
Map<Integer, List<UserVO>> groupByAgeMap = dataList.stream().filter(p -> p.getAge() > 4 ).collect(Collectors.groupingBy(UserVO::getAge));
        for (Map.Entry<Integer, List<UserVO>> entry : groupByAgeMap.entrySet()) {
            System.out.println("年龄=" + entry.getKey() + " 人数=" + entry.getValue().size());
        }

//获取所有用户名称的集合
List<String> userNameList = dataList.stream().map(p -> p.getUserName()).collect(Collectors.toList());

// 返回string用逗号分隔
String userNameStr = dataList.stream().map(p -> p.getUserName()).collect(Collectors.joining(","));
        System.out.println("返回拼接的用户名称=" + userNameStr);

statistics

statistics:统计,可以统计中位数,平均值,最大最小值
DoubleSummaryStatistics statistics = dataList.stream().mapToDouble(p -> p.getAge()).summaryStatistics();
System.out.println("用户年龄最大的数=" + statistics.getMax());
System.out.println("用户年龄最小的数=" + statistics.getMin());
System.out.println("所有用户年龄之和=" + statistics.getSum());
System.out.println("所有用户的平均数=" + statistics.getAverage());

parallelStream

parallelStream:并行流,可以利用多线程进行流的操作,提升效率。但是其不具备线程传播性,因此使用时需要充分评估是否需要用并行流操作
// 并行流
count = dataList.parallelStream().filter(p -> null != p.getAge()).count();
System.out.println("并行流处理所有用户的人数=" + count);

小样一览

import lombok.*;
import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 用户实体类
 * @author 码上有金_0803
 * @date 2022-06-16
 */
@Setter
@Getter
@ToString
public class UserVO {
    private String userName;//名称
    private Integer age;//年龄
    public UserVO() {
    }
    public UserVO(String userName, Integer age) {
        this.userName = userName;
        this.age = age;
    }
}
/**
 * stream测试类
 * @author 码上有金_0803
 * @date 2022-06-16
 */
class StreamUserDemo{

    public static void main(String[] args) {

        //empty()方法用来创建一个空的流
        Stream<String> stream = Stream.empty();
        stream.forEach(System.out::println);

        //使用builder()的时候,声明希望存放的元素类型,此方法就会创建一个流对象
        Stream<String> streamBuilder = Stream.<String>builder().add("ceshi1").add("ceshi2").add("ceshi3").build();
        streamBuilder.forEach(System.out::println);

        List<UserVO> dataList = new ArrayList<>();
        dataList.add(new UserVO("红桃3", 10));
        dataList.add(new UserVO("方块6", 8));
        dataList.add(new UserVO("梅花4", 15));
        dataList.add(new UserVO("黑桃10", 3));
        List<UserVO> resultList = new ArrayList<>();

        Long count = 0L;

        // 筛选出年龄大于10的用户人数
        count = dataList.stream().filter(p -> p.getAge() > 10 ).count();
        System.out.println("年龄大于10的人数=" + count);

        //获取所有用户的年龄集合
        List<Integer> userAgeList = dataList.stream().map(p -> p.getAge()).collect(Collectors.toList());

        // 按用户年龄逆序排序
        resultList = dataList.stream().filter(p -> p.getAge() > 0 ).sorted(Comparator.comparing(UserVO::getAge).reversed()).collect(Collectors.toList());
        resultList.forEach(new Consumer<UserVO>() {
            @Override
            public void accept(UserVO userVO) {
                System.out.println("输出用户年龄=" + userVO.getAge());
            }
        });

        //给每个用户名称前添加标识
        resultList.stream().forEach(p -> p.setUserName("UN".concat(p.getUserName())));

        // 按年龄进行归集
        Map<Integer, List<UserVO>> groupByAgeMap = dataList.stream().filter(p -> p.getAge() > 4 ).collect(Collectors.groupingBy(UserVO::getAge));
        for (Map.Entry<Integer, List<UserVO>> entry : groupByAgeMap.entrySet()) {
            System.out.println("年龄=" + entry.getKey() + " 人数=" + entry.getValue().size());
        }

        //获取所有用户名称的集合
        List<String> userNameList = dataList.stream().map(p -> p.getUserName()).collect(Collectors.toList());

        // 返回string用逗号分隔
        String userNameStr = dataList.stream().map(p -> p.getUserName()).collect(Collectors.joining(","));
        System.out.println("返回拼接的用户名称=" + userNameStr);

        // 并行流
        count = dataList.parallelStream().filter(p -> null != p.getAge()).count();
        System.out.println("并行流处理所有用户的人数=" + count);

        DoubleSummaryStatistics statistics = dataList.stream().mapToDouble(p -> p.getAge()).summaryStatistics();
        System.out.println("用户年龄最大的数=" + statistics.getMax());
        System.out.println("用户年龄最小的数=" + statistics.getMin());
        System.out.println("所有用户年龄之和=" + statistics.getSum());
        System.out.println("所有用户的平均数=" + statistics.getAverage());
    }

}

结束语

谁道人生无再少?门前流水尚能西!休将白发唱黄鸡。我想我还是从前那个少年,没有些许的改变,拒绝躺平,保持初心;任重道远,砥砺前行!
{{o.name}}
{{m.name}}

猜你喜欢

转载自my.oschina.net/u/3146264/blog/5540575