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个问题:

    • 极度简化了代码的同时也导致了逻辑层次显得不那么清晰
    • 增加了异常的堆栈深度
  • 相关阅读:
    聚会
    Wannafly summer camp Day2
    HDU6627 equation
    2019牛客暑期多校D.Big Integer
    对主席树的理解以及使用
    2019牛客暑期多校训练营(第四场)C.sequence(单调栈+线段树)
    2019 Multi-University Training Contest 1
    浅谈序列自动机
    2019江西省程序设计竞赛
    拉格朗日插值的应用
  • 原文地址:https://www.cnblogs.com/liushijie/p/5392169.html
Copyright © 2011-2022 走看看