因此,为了跟上时代的尝试,我想了解有关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();
现在逻辑很清楚 - 过滤和计数。迭代现在是内部的,而不是外部的。
还有许多其他示例,理由和偏好。但是我认为这不仅仅是"美" - 它的重点是什么,而不是当人们考虑迭代时的关注。