直接使用stream流

public class Stream {public static void main(String[] args) {//ArrayList<Object> arrayList = new ArrayList<>(); //List集合不安全,stream().parallel()操作不行List<Object> arrayList = Collections.synchronizedList(new ArrayList<>());//解决方法一:集合工具类// CopyOnWriteArrayList<Object> arrayList = new CopyOnWriteArrayList<>(); //解决方法二:JUC的集合for (int i = 1; i <= 100000; i++) {arrayList.add(String.valueOf(i));}System.out.println("-------------------使用串行流--------------------");ArrayList<Object> result1 = new ArrayList<>();long start = System.currentTimeMillis();arrayList.forEach((str)->{
//        System.out.println(Thread.currentThread().getName()+",操作中。。。");result1.add(new User(2, (String) str,22));});//  System.out.println("使用串行流,修改集合"+result1);System.out.println("花费的时间为:"+(System.currentTimeMillis()-start));System.out.println("-------------------使用并行流--------------------");//这里使用的集合需要注意,不能使用常规的集合,在扩容的时候会出现数组下标越界异常,经过测试CopyOnWriteArrayList集合效率比较低下,因为CopyOnWriteArrayList,在写操作的时候会新建集合List<Object> result2 = Collections.synchronizedList(new ArrayList<>());//CopyOnWriteArrayList<Object> arrayList = new CopyOnWriteArrayList<>();start = System.currentTimeMillis();arrayList.stream().parallel().forEach((str)->{//System.out.println(Thread.currentThread().getName()+",操作中。。。");result2.add(new User(2, (String) str,22));});//   System.out.println("使用并行流,修改集合"+result2);System.out.println("花费的时间为:"+(System.currentTimeMillis()-start));
}}

add操作使用的集合需要注意,不能使用常规的集合,在扩容的时候会出现数组下标越界异常,经过测试CopyOnWriteArrayList集合效率比较低下,因为CopyOnWriteArrayList,在写操作的时候会新建集合,JUC包下的一些集合是可以用的,或者是加锁的集合,但是效率不一定会很高,数据量太大也会导致内存泄漏OOM问题

使用IntStream流

 @Testpublic void testStream(){IntStream intStream = IntStream.of(6, 1, 1, 2, 5, 2, 3, 4);long start=System.currentTimeMillis();//并行处理intStream.parallel().forEach(x->{try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":"+x);});System.out.println("parallel time->"+(System.currentTimeMillis()-start));intStream = IntStream.of(6, 1, 1, 2, 5, 2, 3, 4);start=System.currentTimeMillis();//默认都是串行处理intStream.sequential().forEach(x->{try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+":"+x);});System.out.println("sequential time->"+(System.currentTimeMillis()-start));}

在使用并行流的时候一定要注意线程安全问题,而且并不能保证多个线程之间顺序执行,多线程还需要考虑原子性可见性指令重排等问题,而且效率也不一定会比串行流高很多,在使用的时候需要慎重考虑优劣,毕竟带来的问题还是比较多的

查询表中是否存在想要的记录:

select 1 from table where  。。。 limit 1

在queryMapper后拼接limit条件:

String 中就是sql语句例如:"limit 1"

querymapper.last(String)

遇到很多个表结构差不多的情况,使用反射加上泛型就可以封装一个通用的mapper,这个就是随便写的一个Demo,不一定对,随便瞎写的,大概就是这个意思

public <T,R> R baseMapper(R request,Class<T> po){QueryMapper<T> queryMapper=new QueryMapper();
//这里使用反射获取request的属性,然后拼接mapper条件,其实就相当于写死了,然后判断属性值是否为null,来拼接sql
queryMapper.eq("name",request.hetClass().getgetDeclaredField("name").get(request));
//这里如果属性是私有的话,可以setAccessible(true),来破坏私有属性
return queryMapper;}

idea当前类全局替换: ctrl+r  ,还可以排除不想替换的词

idea大小写转换快捷键:ctrl+shift+u

获取ip地址,这个在多节点情况下对于排查问题时是很有必要的:

InetAddress.getLocalHost().getHostAddress()

stream流将两个集合合并成一个map,一个集合的值当key,一个集合的值为value;这里需要注意key的唯一性问题

public static void main(String[] args) {List<Integer> keyList = new ArrayList<>();List<String> valueList = new ArrayList<>();keyList.add(1);keyList.add(2);keyList.add(3);keyList.add(4);keyList.add(5);valueList.add("张三");valueList.add("李四");valueList.add("王五");valueList.add("赵六");valueList.add("钱七");//使用stream流的方式,把这两个list集合长度一样合并成一个map集合//将list转换mapMap<Object, Object> map = keyList.stream().collect(Collectors.toMap(key -> key, value -> valueList.get(keyList.indexOf(value))));System.out.println(map);//最终需要的结果 {1=张三, 2=李四, 3=王五, 4=赵六, 5=钱七}}

从一个集合中截取指定区间的数据:

ArrayList.subList() ; (左开右闭)

boolean类型的参数尽量不要用is来命名,因为某些框架会自动将Boolean类型参数的is去掉

private Boolean isShow;  ->  private boolean show;

将两个集合合并成一个集合

List<String> list1 = Arrays.asList("阿卫", "阿辉", "阿杰", "阿成");
        List<String> list2 = Arrays.asList("阿悦", "阿楠", "阿洁", "阿锋");
        Stream.concat(list1.stream(),list2.stream());

时间类型作比较

before()和after()方法  必须格式一致

compareTo()方法 返回boolean类型

或者将时间转换为毫秒作比较  getTime()方法

stream流分组排序

LinkedHashMap<Integer, List<Person>> ageMap = persons.stream().sorted(Comparator.comparingInt(Person::getAge)).collect(Collectors.groupingBy(Person::getAge, LinkedHashMap::new, Collectors.toList()));

多字段排序

//先以userId降序,再进行userName升序 **推荐使用该种方式**
    list =  list.stream().sorted(Comparator.comparing(User::getUserId,Comparator.reverseOrder()).thenComparing(User::getUserName)).collect(Collectors.toList());

数组进行翻转

Collections.reverse(arrayList)

自定义常量集合

/** 常量值列表 */
    public static final List<Integer> CONST_VALUE_LIST = Collections.unmodifiableList(Arrays.asList(1, 2, 3));
    /** 常量值集合 */
    public static final Set<Integer> CONST_VALUE_SET = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 2, 3)));
    /** 常量值映射 */
    public static final Map<Integer, String> CONST_VALUE_MAP;
    static {
        Map<Integer, String> valueMap = new HashMap<>();
        valueMap.put(1, "value1");
        valueMap.put(2, "value2");
        valueMap.put(3, "value3");
        CONST_VALUE_MAP = Collections.unmodifiableMap(valueMap);
    }

分割字符串

String dirDiveded[] = fileName.split("/"); String newName = ""; if(dirDiveded.length > 0){ newName = dirDiveded[dirDiveded.length-1]; }

String newName = fileName.substring(fileName.lastIndexOf("/")+1);

http下载

public static void download(List urlStringList) {
        OutputStream os = null;
        InputStream is = null;
        try {
            for (Object urlStringObj : urlStringList) {
                String urlString = (String) urlStringObj;
                // 构造URL
                URL url = new URL(urlString);
                // 打开连接
                URLConnection con = url.openConnection();
                //设置请求超时为5s
                con.setConnectTimeout(5 * 1000);
                // 输入流
                is = con.getInputStream();
                // 1K的数据缓冲
                byte[] bs = new byte[1024];
                // 读取到的数据长度
                int len;
                // 路径
                String filename = urlString.substring(urlString.lastIndexOf("/"));
//                System.out.println(filename);
//                String str = urlString.split(filename)[0];
//                System.out.println(str);
//                String[] split = str.split("//");
//                int i = split[1].indexOf("/");
//                String substring = split[1].substring(i);
//                System.out.println(substring);
 
                // 输出的文件流
                File sf = new File(savePath);
                if (!sf.exists()) {
                    sf.mkdirs();
                }
                os = new FileOutputStream(sf.getPath() + filename+fileType);
                // 开始读取
                while ((len = is.read(bs)) != -1) {
                    os.write(bs, 0, len);
                }
//                System.out.println("下载完成");
            }
            // 完毕,关闭所有链接
            os.close();
            is.close();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                if(null != os){
                    os.close();
                }
                if(null != is){
                    is.close();
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
 
    }

异常处理:Cannot call sendError() after the response has been committed

原因是在流关闭之后接口还返回了数据,使接口返回void即可解决

Protocol handler start failed :端口占用

返回流设置类型:

response.setContentType("multipart/form-data");

返回流,设置文件名称中文失效:

response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));

异常处理:getOutputStream() has already been called for this response

在getOutputStream()和getWriter()中间,使用respomse.reset()方法

如有其他问题评论区见

stream流的应用与并行流相关推荐

  1. 跟我学 Java 8 新特性之 Stream 流(四)并行流

    转载自   跟我学 Java 8 新特性之 Stream 流(四)并行流 随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考, ...

  2. stream銆俠oxed_java-11-Stream优化并行流

    并行流    多线程    把一个内容分成多个数据块  不同线程分别处理每个数据块的流 串行流   单线程  一个线程处理所有数据 java8 对并行流优化  StreamAPI 通过parallel ...

  3. 【java8】并行流Stream

    流在处理数据进行一些迭代操作的时候确认很方便,但是在执行一些耗时或是占用资源很高的任务时候,串行化的流无法带来速度/性能上的提升,并不能满足我们的需要. 通常我们会使用多线程来并行或是分片分解执行任务 ...

  4. 《Java8实战》读书笔记06:Parallel Stream 并行流

    <Java8实战>读书笔记06:Parallel Stream 并行流 第7章 并行数据处理与性能 7.1 并行流 7.1.1 将顺序流转换为并行流 7.1.2 测量流性能 7.1.3 正 ...

  5. java stream 有序_Java8新特性之Stream流专题四 并行流

    随着对流API认识的慢慢深入,本章我们要讨论的知识点是流API里面的并行流了. 在开始讨论并行流之前,我先引发一下大家的思考,就你看到这篇文章的时间,你们是不是经常听到,Intel i7 CPU什么8 ...

  6. 拥抱 Java 8 并行流吧,让执行速度飞起!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:后青春期的Keats cnblogs.com/kea ...

  7. 拥抱并行流,提高程序执行速度

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:后青春期的Keats cnblogs.com/keatsCo ...

  8. 流API--使用并行流

    这篇博客一起来研究下使用并行流.借组多核处理器并行执行代码可以显著提高性能,但是并行编程可能十分复杂且容易出错,流API提供的好处之一是能够轻松可靠的并行执行一些操作.请求并行处理流,首先要获得一个并 ...

  9. 拥抱 Java 8 并行流吧,速度飞起!

    前言 在 Java7 之前,如果想要并行处理一个集合,我们需要以下几步: 手动分成几部分 为每部分创建线程 在适当的时候合并.并且还需要关注多个线程之间共享变量的修改问题. 而 Java8 为我们提供 ...

最新文章

  1. python:Json模块dumps、loads、dump、load介绍
  2. iOS超全开源框架、项目和学习资料汇总:UI篇
  3. 懂了!VMware/KVM/Docker原来是这么回事儿
  4. 119.CSMA/CD
  5. 高精度加法(非负)和大数阶乘及和汽水问题
  6. 卫星系统采用的轨道类型
  7. 低代码发展专访系列之二:两三年内会出现“现象级”低代码产品吗?
  8. 【渝粤题库】陕西师范大学200021现代汉语 作业(高起本、高起专)
  9. CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
  10. 基于ASP.NET AJAX的WebPart开发与部署
  11. Linux常用shell种类
  12. 二维数组最长递增java_动态规划设计之最长递增子序列
  13. java object转泛型_Java 反射:框架设计的灵魂
  14. linux蓝牙主从机模式代码,技术贴 丨 Android 蓝牙BLE开发Docker入门与WMS2.0实例
  15. Kali Linux信息收集工具全集
  16. 麻理工MIT的脑计划eyewire (顺便学习一下医学影像知识)
  17. 闹钟和时间管理工具Alarm Clock Pro mac
  18. 桥接的虚拟机无法ping通物理机
  19. linux websphere 端口号,Linux环境下配置websphere7.0的一些命令
  20. 无人车系统(一):运动学模型及其线性化

热门文章

  1. springboot+springm vc+mybatis实现增删改查案例!
  2. 数据库-------关系数据库标准语言SQL
  3. 【转载】蠕虫病毒 incaseformat 在国内肆虐,可导致用户数据丢失
  4. No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Invers
  5. 质量统计分析人工智能应用APP
  6. 阿德莱德计算机专业offer,2020年阿德莱德大学录取offer介绍及offer多久到
  7. 音频文件如何转换成MP3格式?一分钟教你搞定
  8. IIS的ARR搭建本地服务器的不停机更新(负载均衡,分布式服务器,集群)
  9. Go C画图 CSP-J CSP-S 信息学奥赛 2023.01.10 测试题
  10. ThinkPHP5多语言切换项目实战