草庐IT

C++迭代器(iterator)

全部标签

Java 流与迭代器

我一直在研究Java新的、Shiny的功能部分,最让我困惑的事情之一是流?它们有什么用?在Google上,我主要找到了关于如何使用它们的解释和我已经记下的实际示例,没有关于幕后魔法的具体内容,这正是我感兴趣的地方。我的意思不是实际意义上的,来自一些函数式语言,我想出了map/filter/reduce/等等。相当快,但为什么我们需要先转换为流?Java已经有了迭代器。流和迭代器之间是否存在根本区别,例如一个是惰性的而另一个不是?还是其他原因?底线:迭代器和流之间的根本区别是什么?哪些功能不能作为迭代器的扩展来实现,需要一个全新的类型家族? 最佳答案

java - 从 map 中删除条目而不进行迭代

如何在不使用值或键的迭代的情况下从JavaMap中删除条目。基本上在我的map中,我使用containsKey()然后使用map.remove()来删除它。 最佳答案 您可以使用要删除的元素的键从映射中删除条目。map.remove("aKey");如果您不知道元素的键,您必须像这样迭代以获取它:publicstaticSetgetKeysByValue(Mapmap,Evalue){Setkeys=newHashSet();for(Entryentry:map.entrySet()){if(value.equals(entry.g

java - 如果对同一个集合调用同一个迭代器两次,会发生什么情况?

如果我为myList设置一个迭代器:Iteratoriter=myList.iterator();while(iter.hasNext()){MyObjmyObj=(MyObj)iter.next();doPrint(myObj.toString());}我第二次调用它:while(iter.hasNext()){MyObjmyObj=(MyObj)iter.next();doPrint(myObj.toString());}第二次调用会回到采集开始吗? 最佳答案 iter.hasNext()在第二个循环中会立即返回false,所以

java - 在删除条目时迭代 ConcurrentHashMap

我想在删除条目时定期迭代ConcurrentHashMap,如下所示:for(Iterator>iter=map.entrySet().iterator();iter.hasNext();){Entryentry=iter.next();//dosomethingiter.remove();}问题是在我迭代时另一个线程可能正在更新或修改值。如果发生这种情况,这些更新可能会永远丢失,因为我的线程在迭代时只会看到陈旧的值,但remove()将删除Activity条目。经过一番考虑,我想到了这个解决方法:map.forEach((key,value)->{//deleteifvalueisu

java - 如何从 Iterable/Collection 创建 TreeMultimap?

我正在尝试修剪TreeMultimap,并返回相同结构的TreeMultimap(但已修剪)。例如,我有不同的新闻提供者返回无序新闻。我需要按日期对新闻进行排序,并在按最近日期排序的多图中维护这种排序。然后我需要能够返回最新的X新闻。每个日期,可能有很多新闻。TreeMultimaplatestNews=TreeMultimap.create(Ordering.natural().reverse(),Ordering.natural());因为TreeMultimap没有修剪或大小,我设法返回一个Iterable并用它限制结果,但是如何创建一个新的TreeMultimap来自Itera

java - 迭代 WeakHashMap

我同时使用了WeakHashMap。我想基于一个Integer参数实现细粒度的锁定;如果线程A需要修改由Integera标识的资源,而线程B需要修改由Integerb标识的资源,则它们不需要同步。但是,如果有两个线程使用同一个资源,比如说线程C也在使用由Integera标识的资源,那么当然线程A和C需要在同一个锁上同步。当没有更多线程需要ID为X的资源时,可以移除映射中针对key=X的锁。但是此时可能会有另一个线程进来,尝试使用ID=X的Map中的锁,所以我们需要在加锁/拔锁时进行全局同步。(这是唯一一个每个线程都必须同步的地方,无论Integer参数如何)但是,线程无法知道何时移除锁

java - 如何在 lambda 迭代和普通循环之间做出决定?

自从他引入Java8后,我就真正迷上了lambdas并开始尽可能地使用它们,主要是开始习惯它们。最常见的用法之一是当我们想要迭代并处理一组对象时,在这种情况下,我要么求助于forEach或stream().我很少写旧的for(Tt:Ts)循环,我几乎忘记了for(inti=0.....).然而,前几天我们和我的主管讨论了这个问题,他告诉我lambdas并不总是最好的选择,有时会阻碍性能。从我看到的关于这个新特性的讲座中,我感觉到lambda迭代总是由编译器完全优化,并且(总是?)比裸迭代更好,但他不同意。这是真的?如果是,我如何区分每个场景中的最佳解决方案?P.S:我是不是说说推荐申请

java - 采访 : Design an iterator for a collection of collections

为java中的集合设计一个迭代器。迭代器应该隐藏嵌套,允许您迭代属于所有集合的所有元素,就好像您在处理单个集合一样 最佳答案 这是一个老问题,但如今(2019年)我们有了JDK8+好东西。特别是,我们有流,这使得这个任务变得简单:publicstaticIteratorflatIterator(Collection>collections){returncollections.stream().filter(Objects::nonNull).flatMap(Collection::stream).iterator();}我正在过滤

java - 迭代器空集合

当不确定集合引用是否为null时,我必须在迭代之前检查null是很常见的。示例:Collectioncollection=......if(collection!=null)//troublesomefor(Objecto:collection)当然,我知道空集合比null好得多,但在某些情况下,客户端代码无法控制来自其他模块的可空集合(例如,来自3rd方代码的返回值)。所以我写了一个实用方法:publicstaticIterablenullableIterable(Iterableit){returnit!=null?it:Collections.emptySet();}在客户端代码

java - 公开内部集合项时应该使用 Iterator 还是 Iterable?

我有一个带有私有(private)可变数据列表的类。我需要在以下条件下公开列表项:列表不应在外部修改;使用getter函数的开发人员应该清楚,他们获得的列表无法修改。应将哪个getter函数标记为推荐方法?或者你能提供更好的解决方案吗?classDataProcessor{privatefinalArrayListsimpleData=newArrayList();privatefinalCopyOnWriteArrayListcopyData=newCopyOnWriteArrayList();publicvoidmodifyData(){...}publicIterablegetU