相关疑难解决方法(0)

.toArray(new MyClass [0])或.toArray(new MyClass [myList.size()])?

假设我有一个ArrayList

ArrayList<MyClass> myList;
Run Code Online (Sandbox Code Playgroud)

我想打电话给阿瑞,是否有使用性能的原因

MyClass[] arr = myList.toArray(new MyClass[myList.size()]);
Run Code Online (Sandbox Code Playgroud)

过度

MyClass[] arr = myList.toArray(new MyClass[0]);
Run Code Online (Sandbox Code Playgroud)

我更喜欢第二种风格,因为它不那么冗长,我认为编译器会确保空数组不会真正被创建,但我一直想知道这是不是真的.

当然,在99%的情况下,它不会以某种方式产生影响,但我希望在我的普通代码和优化的内部循环之间保持一致的风格......

java performance coding-style

147
推荐指数
4
解决办法
7万
查看次数

列出<Future>到Future <List>序列

我想转换List<CompletableFuture<X>>CompletableFuture<List<T>>.这非常有用,因为当您有许多异步任务并且需要获得所有异步任务的结果时.

如果其中任何一个失败,则最终的未来将失败.这就是我实施的方式:

  public static <T> CompletableFuture<List<T>> sequence2(List<CompletableFuture<T>> com, ExecutorService exec) {
        if(com.isEmpty()){
            throw new IllegalArgumentException();
        }
        Stream<? extends CompletableFuture<T>> stream = com.stream();
        CompletableFuture<List<T>> init = CompletableFuture.completedFuture(new ArrayList<T>());
        return stream.reduce(init, (ls, fut) -> ls.thenComposeAsync(x -> fut.thenApplyAsync(y -> {
            x.add(y);
            return x;
        },exec),exec), (a, b) -> a.thenCombineAsync(b,(ls1,ls2)-> {
            ls1.addAll(ls2);
            return ls1;
        },exec));
    }
Run Code Online (Sandbox Code Playgroud)

要运行它:

ExecutorService executorService = Executors.newCachedThreadPool();
        Stream<CompletableFuture<Integer>> que = IntStream.range(0,100000).boxed().map(x -> CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep((long) (Math.random() * 10));
            } catch (InterruptedException e) {
                e.printStackTrace(); …
Run Code Online (Sandbox Code Playgroud)

java concurrency java-8 completable-future

67
推荐指数
5
解决办法
3万
查看次数