首页 > 其他分享 >stream操作常用API 示例详解

stream操作常用API 示例详解

时间:2023-02-02 20:00:11浏览次数:36  
标签:stream 示例 List list System API println out

简介

从JDK8开始,增加了一新特性Stream流式操作,Stream中提供了非常多的API供大家使用,灵活的使用这些API,可以非常的方便且优美的实现我们的代码逻辑。

最终型

toArray

toArray:将流转换为数组。

示例:

@Test
public void fun5() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Object[] array = list.stream().toArray();
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
}

结果: image.png

collect

collect:将流转换为指定的类型,比如List转换为Set。

示例:

@Test
public void fun1(){
    String[] data = {"zhangsan","lisi","wanger","mazi"};
    List<String> list = Arrays.stream(data).collect(Collectors.toList());
    System.out.println(list);
    Set<String> set = Arrays.stream(data).collect(Collectors.toSet());
    System.out.println(set);
}

结果: image.png

reduce

reduce:将元素合并起来,得到一个新值。可以简单理解为将一个数组或集合转换成一个String或integer类型的一个对象,最终结果为一个新值。 语法:reduce(a,(b,c)->{b+c})

  • a:规约初始值
  • b:阶段性的累加结果
  • c:当前遍历的元素 注:若是整数类型求和 (Integer),b和c 可换成方法引用 Integer::sum

示例:

@Test
public void fun4() {
    String[] data = {"zhangsan", "lisi", "wanger", "mazi"};
    String reduce1 = Arrays.stream(data).reduce("", (v1, v2) -> v1 + v2);
    System.out.println(reduce1);

    Integer reduce2 = depts.stream().map(Dept::getDeptno).reduce(0, Integer::sum);
    System.out.println(reduce2);
}

结果: image.png

iterator

iterator:将流转换为一个迭代器。

示例:

@Test
public void fun6() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Iterator<String> iterator = list.stream().iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

结果: image.png

foreach

foreach:对流中的元素逐个遍历。 示例:

@Test
public void fun7() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    list.stream().forEach(System.out::println);
}

结果: image.png

anyMatch/allMatch/noneMatch

  • anyMatch:用于判断是否有符合匹配条件的元素。
  • allMatch:用于判断是否所有元素都符合匹配条件。
  • noneMatch:用于判断是否所有元素都不符合匹配条件。

示例:

@Test
public void fun8() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    boolean b1 = list.stream().anyMatch(item -> item.contains("g"));
    System.out.println(b1);
    boolean b2 = list.stream().allMatch(item -> item.contains("g"));
    System.out.println(b2);
    boolean b3 = list.stream().noneMatch(item -> item.contains("g"));
    System.out.println(b3);
}

结果: image.png

findFirst/findAny

  • findFirst:找到第一个匹配的元素后立即返回。
  • findAny:找到任何一个匹配的元素就返回。如果用在一个串行流中,跟findFirst效果一样。如果用在并行流中,就会比较高效。

示例:

@Test
public void fun9() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    Optional<String> first = list.stream().findFirst();
    System.out.println(first.get());

    Optional<String> any = list.stream().findAny();
    System.out.println(any.get());

    int asInt = IntStream.range(10, 99).parallel().findAny().getAsInt();//并行
    System.out.println(asInt);
}

结果: image.png

max/min

  • max:匹配元素最大值并返回。
  • min:匹配元素最小值并返回。

示例:

@Test
public void fun10() {
    int[] data = {88,23,45,92,18,46,78};
    OptionalInt max = Arrays.stream(data).max();
    System.out.println(max.getAsInt());

    OptionalInt min = Arrays.stream(data).min();
    System.out.println(min.getAsInt());
}

结果: image.png

count

count:统计元素的个数,不会自动去重。 示例:

@Test
public void fun11() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi", "lisi", "qianwu");
    long count = list.stream().count();
    System.out.println(count);
}

结果: image.png

中间型

filter

filter:按照指定的条件匹配出符合要求的元素,并返回一个新的stream流。 示例:

@Test
public void fun12() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    List<String> res = list.stream().filter(item -> item.length() > 4)
            .collect(Collectors.toList());
    System.out.println(res);
}

结果: image.png

map

map:将一个对象转换为另一个对象,并返回一个新的stream流。比如,可以把数组中的元素从一种类型转换成另一种类型,也可以将多类型的集合变成单纯的只有一种类型的集合。

示例:

@Test
public void fun3(){
    String[] data = {"zhangsan","lisi","wanger","mazi"};
    List<Integer> list = Arrays.stream(data).map(String::length).collect(Collectors.toList());
    System.out.println(list);
}

结果: image.png

示例:

@Test
public void fun4() {
    List<Integer> list = depts.stream().map(Dept::getDeptno).collect(Collectors.toList());
    System.out.println(list);
}

结果: image.png

flatMap

flatMap:将已有的对象转换为另一个对象,它是一个一对多的逻辑。简单来说就是将多个stream流合并成一个stream。 flatMap与map的区别在于:

  • map是一对一的,即将一个对象转换为另一个对象
  • flatMap是一对多的,即将一个对象拆分对多个对象

示例:

@Test
public void fun17() {
    List<Dept> dept1 = new ArrayList<>();
    dept1.add(new Dept(10, "ACCOUNTING", "NEWYORK"));
    dept1.add(new Dept(20, "RESEARCH", "DALLAS"));

    List<Dept> dept2 = new ArrayList<>();
    dept2.add(new Dept(30, "SALES", "CHICAGO"));
    dept2.add(new Dept(40, "OPERATIONS", "BOSTON"));

    //map 一对一 映射处理
    dept1.stream()
            .map(dept -> {
                Dept build = dept.builder()
                        .deptno(dept.getDeptno() * 2)
                        .dname(dept.getDname().toLowerCase())
                        .loc(dept.getLoc().toLowerCase())
                        .build();
                return build;
            }).toList()
            .forEach(System.out::println);

    List<List<Dept>> depts = new ArrayList<>();
    depts.add(dept1);
    depts.add(dept2);
    //flatMap  一对多映射处理,深入到多个stream内部去处理子元素,统一输出
    depts.stream().flatMap(item -> item.stream()
                    .filter(dept -> dept.getDeptno() > 20))
            .toList()
            .forEach(System.out::println);
}

结果: image.png

<br>

map和flatMap都可以将一个流的元素按照一定的映射规则映射到另一个流中:

  • map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
  • flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。 image.png

示例:

@Test
public void fun16() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    //接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
    List<String> res1 = list.stream().map(String::toUpperCase).toList();
    System.out.println(res1);

    //接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
    List<String> collect = list.stream().flatMap(item -> {
        String[] split = item.split("");
        Stream<String> stream = Arrays.stream(split);
        return stream;
    }).collect(Collectors.toList());
    System.out.println(collect);
}

结果: image.png

peek

peek:对流中的元素逐个遍历处理,它与map的区别在于:map一般用于对象的转换,peek用于对象的消费,即不改变元素本身的类型。 示例:

@Test
public void fun13() {
    List<Integer> list2 = Arrays.asList(1,2,3,4);
    list2.stream()
            .peek(x -> System.out.println("stream: " + x)) //peek是对元素逐一消费
            .map(x -> x * 2) //map是对元素进行转换
            .peek(x -> System.out.println("map: " + x))
            .collect(Collectors.toList());
}

结果: image.png

示例:

@Test
public void fun14() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    // 使用peek操作流,流中的元素没有改变。
    list.stream().peek(String::toUpperCase).forEach(System.out::println);
    // 使用map操作流,流中的元素有改变。
    list.stream().map(String::toUpperCase).forEach(System.out::println);
}

结果: image.png

limit/skip

  • limit:就相当于sql中的limit,可以指定保留前N的元素。
  • skip:作用与limit相反,会抛弃前N的元素。

示例:

@Test
public void fun18() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi","qianwu","zhaoliu");
    list.stream().limit(3).toList().forEach(System.out::println);
    list.stream().skip(2).toList().forEach(System.out::println);
}

结果: image.png

sorted

sorted:用于对流中的数据排序 示例:

@Test
public void fun22() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi");
    list.stream()
            .sorted(Comparator.comparingInt(String::length))
            .toList()
            .forEach(System.out::println);
}

结果:

concat

concat:可以将多个流的数据合并为一个流。 示例:

@Test
public void fun20() {
    List<String> list1 = List.of("zhangsan", "lisi", "wanger");
    List<String> list2 = List.of("mazi","qianwu","zhaoliu");
    Stream.concat(list1.stream(),list2.stream())
            .toList()
            .forEach(System.out::println);

}

结果: image.png

distinct

distinct:用于对流中的元素去重。 示例:

@Test
public void fun21() {
    List<String> list = List.of("zhangsan", "lisi", "wanger", "mazi","lisi","mazi");
    list.stream().distinct().toList().forEach(System.out::println);
}

结果: image.png

标签:stream,示例,List,list,System,API,println,out
From: https://blog.51cto.com/lianghecai/6033856

相关文章

  • cache API简介
    cacheAPI是一个很强大的API,它可以在window环境和serviceWorker环境使用,配合serviceWorker可以让我们自己来管理缓存。cachescaches是一个全局接口,可以在window和worker......
  • java8 stream 用法
    1privateList<User>users=Arrays.asList(2newUser("1001","John",16),3newUser("1002","Carly",17),4new......
  • 常用API大全分享!赶紧收藏起来!
    一、短信发送短信的应用可以说是非常的广泛了,短信API也是当下非常热门的API~短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可达,99.9......
  • VUE API接口的统一管理
    vue项目对api进行封装统一管理在日常vue项目中或刚接收一个vue项目,如果项目足够大,就需要进行统一管理和规范接口了1.js文件创建先在src目录下新建一个api文件夹,然后......
  • 使用python编写简单的api接口
    先安装flask模块pipinstallFlaskpy文件fromflaskimportFlask,request,jsonifyapp=Flask(__name__)@app.route('/hello_world')defhello_world():r......
  • Yapi 部署 (Docker-compose部署)
    目录资源清单一、Docker安装1.使用国内yum源2.卸载旧版本的docker3.安装Docker20.10版本4.设置镜像加速5.启动docker二、Docker-compose安装1.Docker-compos......
  • API(Calendar)
    Calendar代表系统当前的时间日历对象,可以单独修改获取时间中的年月日Calendar是一个抽象类,不能创建对象,获取Calendar日历类对象的方法:publicstatic  Calendar get......
  • apiview、request、response源码分析、serializer基本使用
    昨日回顾#1restful规范 -https协议,保证安全-接口中带api标识 -api.baidu.com-www.baidu.com/api -接口中带版本标识-接口即资源,尽量用名......
  • Dubbo 入门系列之基于 Dubbo API 开发微服务应用
    目标从零上手开发基于Dubbo的微服务难度低环境要求系统:Windows、Linux、MacOSJDK8及以上(推荐使用JDK17)GitIntelliJIDEA(可选)Docker(可选)动手实......
  • json格式数据,淘宝1688京东商品详情获取,便携式API接口
    商品详情API接口,万邦数据返回值说明,商品详情,关键词搜索,价格监控,卖家买家订单等相关数据接口商品详情获取 测试接口 json格式数据 "item":{ "num_iid":"583191269......