- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解为什么 java 8 有 forEach 循环并将消费者功能接口(interface)作为参数。即使我们可以使用传统的 for each 循环来完成相同的任务,而不会产生任何额外的开销来创建一个从 Consumer 实现的类并实现一个方法,然后将其作为引用传递给 forEach()。虽然有 lambda 表达式使它变短。
Q1-为什么是 iterable.forEach()?
Q2。在哪里使用它?
Q3。对于 Java 8 forEach() 中的每一个,哪一个更快?
样本:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
import java.lang.Integer;
public class ForEachExample {
public static void main(String[] args) {
//creating sample Collection
List<Integer> myList = new ArrayList<Integer>();
for(int i=0; i<10; i++) myList.add(i);
//traversing using Iterator
Iterator<Integer> it = myList.iterator();
while(it.hasNext()){
Integer i = it.next();
System.out.println("Iterator Value::"+i);
}
//traversing through forEach method of Iterable with anonymous class
myList.forEach(new Consumer<Integer>() {
public void accept(Integer t) {
System.out.println("forEach anonymous class Value::"+t);
}
});
//traversing with Consumer interface implementation
MyConsumer action = new MyConsumer();
myList.forEach(action);
}
}
//Consumer implementation that can be reused
**class MyConsumer implements Consumer<Integer>{
public void accept(Integer t) {
System.out.println("Consumer impl Value::"+t);
}
}**
最佳答案
受函数式编程启发的新 API 的总体思想是表达要做什么而不是如何去做。即使使用简化的 for-each 循环,
for(Integer i: myList) System.out.println("Value::"+i);
Iterator
”指令的语法糖。实例和反复调用
hasNext()
和
next()
在上面”。
myList.forEach(i -> System.out.println("Value::"+i));
default
实现将只执行
Iterator
基于循环,但实际
Iterable
实现可能会覆盖它以不同方式执行操作。
Iterator
实现会执行两次检查,一次在
hasNext()
,然后在
next()
因为不能保证调用者做了
hasNext()
首先,抛出一个
NoSuchElementException
如果没有下一个元素。有时这甚至意味着在
Iterator
中持有额外的状态。实例来记住是否已经执行了特定的“fetch-next”操作。专属
forEach
实现可以更直接、更高效,同时代码更简单。
ArrayList
执行
int
-基于索引的循环,不构造
Iterator
例如,
Collections.emptyList()
除了检查
Consumer
什么都不做反对
null
,
TreeSet
分别它的后盾
TreeMap
遍历入口链接,比它的
Iterator
简单多了必须支持
remove
的实现操作等等。
forEach
实现可能会补偿
Consumer
与构造相关的开销,如果有的话(请注意
not every lambda expression creates a new object),是不可预测的,并且对此的假设不应驱动软件设计。通常,性能差异可以忽略不计。
Collections.synchronized…
返回的集合之一时, 一个
Iterator
当底层集合被另一个线程修改时,基于循环不能提供一致性保证。应用程序需要手动锁定集合,并且必须注意使用正确的对象实例,例如如果迭代是
subList
或
subSet
.相比之下,专门的
forEach(Consumer)
在整个操作期间正确锁定,而操作本身就像委托(delegate)给源的
forEach
一样简单方法,仍然根据实际的底层集合以最佳方式执行它。
关于lambda - 为什么 java 8 引入了 iterable.forEach() 循环,即使它有每个循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51016229/
我正在尝试表达以下内容: 给定一个矩阵和两个索引增量,返回矩阵中所有数字的四倍体:沿行,列或对角线的四倍体。 use std::iter::Iterator; use std::iter::Peeka
假设我们有以下类组成角色 Iterable : class Word-Char does Iterable { has @.words; method !pairize($item)
我编写了一个 ADT 排序二叉树,其功能如下: public Iterator getInorderIterator(){ return new InorderIterator(); } 有效
在包装(内部)迭代器时,通常必须将 __iter__ 方法重新路由到底层可迭代对象。考虑以下示例: class FancyNewClass(collections.Iterable): def
尽管如此,我遍历了以下 NSSet , NSMutableArray , NSFastEnumeration文档,我找不到下面提到的场景的令人满意的来源: 此处,NSMutableArray、NSAr
我发现在 Python 中 collections.Iterable 和 typing.Iterable 都可以用于类型注释和检查对象是否可迭代,即 >isinstance(obj, collecti
我想拆分实现 Iterator 的对象的输出分为两个实现 Iterator 的对象和 Iterator .由于其中一个输出的迭代次数可能比另一个多,因此我需要缓冲 Iterator 的输出。 (因为我
我正在尝试用 Rust 编写一个简单的迭代器: #[derive(Debug)] pub struct StackVec { storage: &'a mut [T], len: us
什么意思: Separator.Iterator.Element == Self.Iterator.Element.Iterator.Element 在this (Swift 标准库)swift 实例
调用 anIterable.iterator() 会返回新的迭代器还是现有的迭代器?它依赖于 Iterable 的实现吗? 更具体地说,以下代码是否按预期工作(即内部循环将从头开始迭代)? for (
我正在尝试转换 &str 的矢量对成一个 HashMap使用以下代码片段: use std::collections::HashMap; fn main() { let pairs = vec!(
这将使安全地迭代同一元素两次成为可能,或者为在项目类型中迭代的全局事物保持某种状态。 类似于: trait IterShort where Self: Borrow, { type I
我在 String 的字符上使用迭代器: pub fn is_yelling(message: &str) -> bool { let letters = message.chars().fi
这将使安全地迭代同一元素两次成为可能,或者为在项目类型中迭代的全局事物保持某种状态。 类似于: trait IterShort where Self: Borrow, { type I
要在 Rust 中实现迭代器,我们只需要实现 next 方法,如 in the documentation 所解释的那样.但是,Iterator 特征 has many more methods .
我正在为多个结构实现 Iterator 特性并遇到了一些问题。为什么为 Rows 实现 Iterator 显示错误?这是一个链接:link to playground 基本上为什么这不起作用? str
我将集合转储到磁盘上。当请求时,应该检索这些集合(没问题)和 iterator应该为它构建返回对检索到的值的引用。 iterator之后被丢弃了,我不再需要收藏了。我也希望它被删除。 到目前为止我尝试
我正在尝试为实现特征的结构实现默认迭代器。我的特征称为 DataRow,代表一行表格单元格,如下所示: pub trait DataRow { // Gets a cell by index
Rust 中是否有提供 iter() 的 Trait方法?我只找到了特征 IntoIterator ,供应into_iter() . 这里要明确一点:我不想要 Iterator特性,提供 next()
我想在迭代器上定义一个 .unique() 方法,使我能够在没有重复的情况下进行迭代。 use std::collections::HashSet; struct UniqueState {
我是一名优秀的程序员,十分优秀!