在这篇文章中,我遇到了一些巧妙的代码,可以将Karl的Iterator转换为Stream
。我不得不承认我不完全理解如何Iterable
在以下代码中将lambda分配给该类型…
static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
final Iterable<T> iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), false);
}
我决定编写自己的小型测试,以确保它能够编译和执行。
public void printsStream_givenIterator()
{
Iterator<String> iterator = Arrays.asList("a", "b", "c").iterator();
final Iterable<String> iterable = () -> iterator;
StreamSupport.stream(iterable.spliterator(), false).forEach(s -> System.out.println(s));
}
// prints: abc
我的理解是lambda () -> iterator
充当了供应商功能。
Iterable不是FunctionalInterface,因此如何为其分配lambda?
() -> iterator
是 不是
“作为一个Supplier
功能”。可以将Lambda表达式分配给任何一致的功能接口类型。并且不需要功能接口带有注释@FunctionalInterface
。您可以Iterable
使用lambda表达式创建一个,该表达式将实现Iterable.iterator()
方法,这是该abstract
接口的唯一方法。然而,通过返回相同的实现它Iterator
的每个时间点可能违反多次能够迭代这个对象(其中的原因是预期为什么Stream
没有实现Iterable
,尽管有一个iterator()
方法)。
该解决方案将在狭窄的环境中工作,但并不明智。
序列
final Iterable<T> iterable = () -> iterator; … iterable.spliterator()
在之前仅介绍了一个额外的步骤Spliterators.spliteratorUnknownSize(iterator, 0)
,这是实现default
方法的方法Iterable.spliterator()
。
所以
static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
final Iterable<T> iterable = () -> iterator;
return StreamSupport.stream(iterable.spliterator(), false);
}
只是效率较低的一种
static <T> Stream<T> iteratorToFiniteStream(final Iterator<T> iterator) {
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
}
如果将其与已链接的“问答”的可接受答案进行比较,您会发现它确实是正确的,但是该答案利用了传递特定characteristics
而不是的机会0
。
问题内容: 仅仅使用Java 8中的新lambda和功能特性,我不确定如何做到这一点。 例如,以下内容有效: 但是以下内容给我语法错误: 有任何想法吗? 问题答案: 您已经忘记了: 运行:
问题内容: 我试图为对象类型分配一个lambda: 它给我一个错误的说法: 为什么会这样,怎么做? 问题答案: 这是不可能的。根据错误消息不是功能接口,即具有单个公共方法的接口,因此您需要使用引用类型,例如
以前,我从android的文件夹中读取了一个json文件, 但是现在为null。请纠正我 错误日志是,
问题内容: 鉴于这段JavaScript代码… 有人可以向我解释这种技术叫什么(我的最佳猜测是这个问题的标题!)?以及它如何/为什么确切起作用? 我的理解是,将为变量分配第一个变量的最接近的值(从左到右),该变量的值不为null或未定义,但是我没有设法找到有关此技术的大量参考资料,并且看到它用了很多。 另外,这项技术是否专门针对JavaScript?我知道在PHP中执行类似操作会导致具有真正的布尔
本文向大家介绍Fortran 分配格式说明符,包括了Fortran 分配格式说明符的使用技巧和注意事项,需要的朋友参考一下 示例 在Fortran 95之前,可以将分配的格式用于输入或输出。考虑 该assign语句将语句标签分配给整数变量。以后将此整数变量用作print语句中的格式说明符。 在Fortran 95中删除了这种格式说明符分配。相反,更现代的代码可以使用其他形式的执行流控制 或字符变量