Java 8中的迭代阵列的功能操作



因此,为了跟上时代的尝试,我想了解有关Java 8的新功能操作的能力。除了看上去更好的观点(完全基于意见(外,有人是否想详细描述使用Java 8的新功能编程样式来迭代迭代阵列中的肯定(甚至是负面(?

这就是我的意思:

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);
        }
    }

仅是部分答案,但是迭代器的一般点正在从 external 迭代转移到内部迭代。foreach只是一个替代品,但请考虑以下内容(来自 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)));
}

这是针对流的并行操作,删除了所有外部迭代要求和所有手动螺纹要求。它替换了50-60行代码。

它也从对如何完成某件事(例如OP的Java Pre-Java 8示例(的重点转移到了要完成的工作。

考虑具有.isFrom(String)方法的Artist类。在OP的第一个示例中,要计算来自利物浦的数量,代码将是:

int count = 0; 
for (Artist artist : allArtists) {
  if (artist.isFrom("Liverpool")) {
    count++;
  }
}

请注意,积累的欲望在循环和过滤中丢失。与:

对比
allArtists.stream()
  .filter(artist -> artist.isFrom("Liverpool")
  .count();

现在逻辑很清楚 - 过滤和计数。迭代现在是内部的,而不是外部的。

还有许多其他示例,理由和偏好。但是我认为这不仅仅是"美" - 它的重点是什么,而不是当人们考虑迭代时的关注。

最新更新