Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8中迭代数组的函数操作_Java_Functional Programming - Fatal编程技术网

Java 8中迭代数组的函数操作

Java 8中迭代数组的函数操作,java,functional-programming,Java,Functional Programming,因此,为了跟上时代的步伐,我想尽我所能了解Java8的新功能操作。除了那些看起来更好、完全基于观点的观点之外,有人想详细描述一下使用Java8新的函数式编程风格迭代数组的优点(可能还有缺点)吗 这就是我的意思: 前Java 8: for(Object item: itemList){ item.doSomething(); } Java 8: itemList.stream().forEach((item) -> { item.do

因此,为了跟上时代的步伐,我想尽我所能了解Java8的新功能操作。除了那些看起来更好、完全基于观点的观点之外,有人想详细描述一下使用Java8新的函数式编程风格迭代数组的优点(可能还有缺点)吗

这就是我的意思:

前Java 8:

    for(Object item: itemList){
        item.doSomething();
    }
Java 8:

    itemList.stream().forEach((item) -> {
        item.doSomething();
    });
这些答案启发了我,所以我将写一些东西来证明它的潜力

    static int pos = 0;

    public static void main(String[] args) {
        List<Worker> workers = Arrays.asList(new Worker[1000]);
        workers.replaceAll(worker -> new Worker(pos++));
        workers.parallelStream().forEach(Worker::startJob);
    }

    public static class Worker {
        final int pos;

        public Worker(int pos) {
            this.pos = pos;
        }

        public synchronized void startJob() {
            try {
                wait(100);
            } catch (InterruptedException ex) {
                Logger.global.log(Level.SEVERE, null, ex);
            }
            System.out.println("Finished... " + pos);
        }
    }
static int pos=0;
公共静态void main(字符串[]args){
List Worker=Arrays.asList(新Worker[1000]);
工人.replaceAll(工人->新工人(pos++));
workers.parallelStream().forEach(Worker::startJob);
}
公共静态类工作者{
最终int pos;
公职人员(内部职位){
this.pos=pos;
}
公共同步的void startJob(){
试一试{
等待(100);
}捕获(中断异常例外){
Logger.global.log(Level.SEVERE,null,ex);
}
系统输出打印项次(“完成…”+位置);
}
}

仅给出部分答案,但迭代器的一般要点是从外部迭代转移到内部迭代。<代码>前缀只是一个替换,但是考虑下面的(从java 8 lambdas)模拟掷骰子:

public Map < Integer, Double > parallelDiceRolls() { 
  double fraction = 1.0 / N; 
  return IntStream.range( 0, N) .parallel()
    .mapToObj( twoDiceThrows())
    .collect( groupingBy( side -> side, summingDouble( n -> fraction)));
}
请注意,在循环和过滤过程中,积累的欲望消失了。与之相比:

allArtists.stream()
  .filter(artist -> artist.isFrom("Liverpool")
  .count();
现在逻辑清楚了——一个过滤和一个计数。迭代现在是内部的,而不是外部的


还有许多其他的例子、理由和偏好。但我认为这不仅仅是“美”——当人们考虑迭代时,它关注的是什么,而不是如何进行。

这是一个糟糕的比较,因为它们并不等价。后者可能是懒惰的,因此可以有效地与其他操作结合。这是一个品味和观点的问题。没有直接、简单的答案。对于某些场景,函数式方法更好,而对于其他场景,坚持命令式是最好的选择主要的优点是并行执行操作,如果操作不是有状态的,只需用parallelStream替换stream。因为您去掉了“how”而留下了“what”。您的代码应该如下所示。itemList.forEach(项目::doSomething);这段代码可读性很好。我知道你在这个答案中做了一些工作,但这是一个征求意见的问题,因此应该关闭,而不是回答。@bhspencer,虽然我同意这是一个意见问题,应该关闭,迭代是否仅仅是杂乱无章的,而不是暴露出来的,这一点很有意思。这不是一个结论性的或最终的答案,但它确实解决了OP的主要问题。感谢您指出.parallel()函数,这立即使积极因素变得更加明显。不,我不是在征求意见。我想了解更多关于正面和负面观点的信息。另外一个让人紧张的事情。“斯彭斯,我很好奇你为什么认为自己是这个网站的白骑士。花20分钟喋喋不休地谈论为什么这样做不好,你会得到什么?
allArtists.stream()
  .filter(artist -> artist.isFrom("Liverpool")
  .count();