zoukankan      html  css  js  c++  java
  • Java 8之二小坑:stream parallel 和 lamada

    Stream:parallel乱序

    Java 8 stream流为处理集合时非常方便。遇到的一个坑是为了提高在多核cpu下的性能,尝试了parallel()。数据源是HashSet的,在做分割的时候发现每次跟串行的结果都不一样。
    解决方式:

    • 后来改为有序的LinkedHashSet再使用parallel。
    • 去掉parallel,让stream串行执行

    lamada:

    如下代码:

    public static void main(String[] args) throws Exception {
            testHashCode(() -> {});
            testHashCode(() -> {});
        }
    
    
        private static void testHashCode(Runnable runnable) {
            System.out.println(runnable.hashCode());
        }
    

    结果发现两个输出的hashCode是不一样的,因此可以确定两次调用的runnable不是一个对象,即可以理解为:

    () -> {}
    

    等价于

    new Runnable() {
    	public void run() {...}
    }
    

    实例化对象是有代价的,如果频繁实例化会加剧YGC,所以在QPS比较高的请求中需要注意这点,因为不像直接用new这种实例化方式一样很明显发现问题。现有项目中基本很多这样的代码,是可以优化的。可以搞个单例。
    除了上面需要注意的这点,lamada表达式还有2个问题:

    • 极度简化了代码的同时也导致了逻辑层次显得不那么清晰
    • 增加了异常的堆栈深度
  • 相关阅读:
    JavaScript 正则表达式
    git常用命令
    用纯css使内容永远居在页面底部
    Oracle中随机抽取N条记录
    表数据回复到某个时候
    oracle同名存储过程被覆盖后如何恢复(转)
    mybatis+spring+mysql
    定位
    关于js的闭包和复制对象
    idea展示runDashboard的窗口
  • 原文地址:https://www.cnblogs.com/liushijie/p/5392169.html
Copyright © 2011-2022 走看看