关于JavaStream的一些小练习

一、导读

本文着重讲解java8的Stream的一些基本操作map,filter,sorted,collect

好文章 记得 收藏+点赞+关注 !!!

二、什么是stream
在这里插入图片描述
Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

和以前的Collection操作不同, Stream操作还有两个基础的特征:

  1. Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  2. 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

三、stream的一些小练习

import com.gf.pojo.User;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * 练习使用串行流,并行流
 *
 * @author JiaMing
 * @since 2021/12/7/0007 下午 14:14
 **/

public class StreamTest {

    public static void main(String[] args) {
        //创建个定长的list
        List<String> strings = Arrays.asList("jiaMing", "haha", "", "hello", "world");
        //过滤掉空字符串
        List<String> list = strings.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());
        //for each遍历集合
        list.forEach(System.out::println);
        System.out.println("----------------------");

        //for each遍历生成的10个随机数
        Random random = new Random();
        random.ints().limit(10).forEach(System.out::println);
        System.out.println("----------------------");

        //使用Filter计算空字符串个数
        long count = list.stream().filter(String::isEmpty).count();
        System.out.println(count + "个");
        System.out.println("----------------------");

        //limit 获取指定数量的流
        list.stream().filter(s -> !s.isEmpty()).limit(2).forEach(System.out::println);
        System.out.println("----------------------");

        //sorted对流进行排序。对输出的 10 个随机数进行排序
        random.ints().limit(10).sorted().forEach(System.out::println);
        System.out.println("----------------------");

        //map用于映射每个元素到对应的结果,使用 map 输出了元素对应的平方数
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(1);
        arrayList.add(2);
        arrayList.add(4);
        arrayList.stream().map(integer -> integer * integer).distinct().forEach(System.out::println);
        System.out.println("----------------------");

        //使用stream提取List对象的某一列值,定义一个user类,创建几个user
        List<User> users = new ArrayList<>();
        users.add(new User(1, "佳明", "123456", "上海"));
        users.add(new User(2, "张伟", "1234567", "帝都"));
        users.add(new User(3, "叶若雪", "12342567", "花城"));
        List<String> collect = users.stream().map(User::getUsername).distinct().collect(Collectors.toList());
        collect.forEach(System.out::println);
    }
}

在这里插入图片描述
在这里插入图片描述

注意:

使用Arrays.asList将数组转成集合时,当你向这个List添加或删除一个元素时(例如 list.add(“hello”);)程序就会抛出异常(java.lang.UnsupportedOperationException)
在这里插入图片描述
原因如下:
当你看到这段代码时可能觉得没有问题,不就是返回了一个ArrayList对象吗?问题就出在这里。
这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList
它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。
而AbstractList中的add()和remove()是直接抛出java.lang.UnsupportedOperationException异常的!
在这里插入图片描述

如果你想创建可变长度的list可以这样:

List<String> list = new ArrayList<>();
list.addAll(Arrays.asList("haha","world"));

参考:https://www.runoob.com/java/java8-streams.html

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值