Tag: java stream

如何使用Java 8流制作笛卡尔积?

我有以下集合类型: Map<String, Collection> map; 我想从每个Key的集合中的单个值创建每个map.size()唯一组合。 例如,假设地图如下所示: A, {a1, a2, a3, …, an} B, {b1, b2, b3, …, bn} C, {c1, c2, c3, …, cn} 我想得到的结果是List<Set>结果,看起来类似于(排序并不重要,它只需要是一个由所有可能组合组成的’完整’结果): {a1, b1, c1}, {a1, b1, c2}, {a1, b1, c3}, {a1, b2, c1}, {a1, b2, c2}, {a1, b2, c3}, … {a2, b1, c1}, {a2, b1, c2}, … {a3, b1, c1}, {a3, […]

Stream.forEach是否遵循顺序流的遭遇顺序?

Stream.forEach的Javadoc说(强调我的): 此操作的行为明确是不确定的。 对于并行流管道,此操作不保证遵守流的遭遇顺序 ,因为这样做会牺牲并行性的好处。 对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作。 如果操作访问共享状态,则它负责提供所需的同步。 Java 9 Early Access Javadoc中提供了相同的文本。 第一句(“明确不确定”)表明(但没有明确说明)此方法不会保留遭遇顺序。 但下一句明确表示顺序未被保留的句子以“For parallel stream pipeline”为条件,如果不管并行性如何应用该句子,则不需要该条件。 这让我不确定forEach是否会保留顺序流的顺序。 这个答案指出了流库实现调用.sequential().forEach(downstream) 。 这表明forEach旨在保留顺序流的顺序,但也可能只是库中的错误。 我通过使用forEachOrdered安全地回避了我自己的代码中的这种歧义,但今天我发现NetBeans IDE的“使用function操作”编辑器提示将转换 for (Foo foo : collection) foo.bar(); 成 collection.stream().forEach((foo) -> { foo.bar(); }); 如果forEach不保留遭遇顺序,则会引入错误。 在我报告针对NetBeans的错误之前,我想知道库实际上保证了什么,并由源备份。 我正在寻找权威人士的答案 。 这可能是图书馆实施中的明确评论,关于Java开发邮件列表的讨论(谷歌没有找到任何东西,但我可能不知道这些神奇的词汇),或者是图书馆设计师的声明(其中我知道两个, Brian Goetz和Stuart Marks ,积极参与Stack Overflow)。 (请不要回答“只是使用forEachOrdered” – 我已经做了,但我想知道代码是否错误。)

流和懒惰的评估

我正在阅读流抽象的java 8 API ,但我不太理解这句话: 中间操作返回一个新流。 他们总是懒惰; 执行诸如filter()之类的中间操作实际上并不执行任何过滤,而是创建一个新流,当遍历时,该流包含与给定谓词匹配的初始流的元素。 在执行管道的终端操作之前,不会开始遍历管道源。 当过滤操作创建新流时,该流是否包含过滤后的元素? 似乎理解流仅在遍历时才包含元素,即具有终端操作。 但是,包含过滤流的内容是什么? 我很困惑!!!

相当于Scala dropWhile

我正在努力寻找一种方法来跳过流的开头的一些元素,具体取决于谓词。 像这样的东西: dropWhile( n -> n < 3, Stream.of( 0, 1, 2, 3, 0, 1, 2, 3, 4 ) ) .forEach( System.out::println ); 3 0 1 2 3 4 这相当于Scala dropWhile 。

在Java 8中,是否有ByteStream类?

Java 8为double , int和long提供了Stream : DoubleStream , IntStream和LongStream 。 但是,我在文档中找不到等效的byte 。 Java 8是否提供ByteStream类?

Java 8嵌套(多级)组

我有几个类,如下 class Pojo { List items; } class Item { T key1; List subItems; } class SubItem { V key2; Object otherAttribute1; } 我想基于key1聚合项目,对于每个聚合,子项应由key2按以下方式聚合: Map<T, Map<V, List> 如何使用Java 8 Collectors.groupingBy嵌套? 我正在尝试一些东西并且中途停留 pojo.getItems() .stream() .collect( Collectors.groupingBy(Item::getKey1, /* How to group by here SubItem::getKey2*/) ); 注意:这与级联groupingBy ,后者基于此处讨论的同一对象中的字段进行多级聚合

在Java中,如何高效优雅地传输树节点的后代?

假设我们有一组由唯一String标识的对象,以及一个定义它们层次结构的类Tree 。 该类使用从节点(由其ID表示)到其各自子节点ID的Collection的Map来实现。 class Tree { private Map<String, Collection> edges; // … public Stream descendants(String node) { // To be defined. } } 我想启用流式节点的后代。 一个简单的解决方案是: private Stream children(String node) { return edges.getOrDefault(node, Collections.emptyList()).stream(); } public Stream descendants(String node) { return Stream.concat( Stream.of(node), children(node).flatMap(this::descendants) ); } 在继续之前,我想对此解决方案做出以下断言。 (我对这些是正确的吗?) 从descendants返回的Stream消耗资源(时间和内存) – 相对于树的大小 – 与复制的手动编码的复杂程度相同。 特别是,表示迭代状态的中间对象( Stream s, […]