当前位置: 首页 > 面试题库 >

说明如何将此lambda分配给Iterable

茅鸿宝
2023-03-14
问题内容

在这篇文章中,我遇到了一些巧妙的代码,可以将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中删除了这种格式说明符分配。相反,更现代的代码可以使用其他形式的执行流控制 或字符变量