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

等价于Scala drop

吕宇定
2023-03-14
问题内容

我正在努力寻找一种方法,以根据谓词在流的开头跳过某些元素。

像这样:

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


问题答案:

这种操作不是Streams 的预期用例,因为它并入了元素之间的依赖关系。因此,该解决方案可能看起来不太好,因为您必须为谓词引入一个全状态变量:

class MutableBoolean { boolean b; }
MutableBoolean inTail = new MutableBoolean();

IntStream.of(0, 1, 2, 3, 0, 1, 2, 3, 4)
         .filter(i -> inTail.b || i >= 3 && (inTail.b = true))
         .forEach(System.out::println);

请注意,与您的示例相比,该条件必须颠倒。

当然,您可以在方法中隐藏令人讨厌的细节:

public static void main(String... arg) {
    dropWhile(n -> n < 3, Stream.of(0, 1, 2, 3, 0, 1, 2, 3, 4))
      .forEach(System.out::println);
}
static <T> Stream<T> dropWhile(Predicate<T> p, Stream<T> s) {
    class MutableBoolean { boolean b; }
    MutableBoolean inTail = new MutableBoolean();
    return s.filter(i -> inTail.b || !p.test(i) && (inTail.b = true));
}

一个更复杂,但更清洁,可能更有效的方法是深入研究金属,即Spliterator界面:

static <T> Stream<T> dropWhile(Predicate<T> p, Stream<T> s) {
    Spliterator<T> sp = s.spliterator();
    return StreamSupport.stream(new Spliterators.AbstractSpliterator<T>(
            sp.estimateSize(), sp.characteristics() & ~Spliterator.SIZED) {
        boolean dropped;
        public boolean tryAdvance(Consumer<? super T> action) {
            if(dropped) return sp.tryAdvance(action);
            do {} while(!dropped && sp.tryAdvance(t -> {
                if(!p.test(t)) {
                    dropped=true;
                    action.accept(t);
                }
            }));
            return dropped;
        }
        public void forEachRemaining(Consumer<? super T> action) {
            while(!dropped) if(!tryAdvance(action)) return;
            sp.forEachRemaining(action);
        }
    }, s.isParallel());
}

可以使用与第dropWhile一种方法相同的方法,但是即使并行流也可以使用,尽管效率不如您期望的那样。



 类似资料:
  • 问题内容: 我是来自C / STL的相对较新的Java程序员,并且正在寻找具有以下特征的类(据我所了解,C std :: deque具有): O(1)在开头/结尾插入/移除的性能 按索引查找的O(1)性能 是可增长的集合(不需要固定的大小范围) 是否有与此等效的Java?我发现Java 1.6 [ArrayDeque]类具有插入/移除和可增长的特性,但是似乎没有按索引查找的方法,除非调用toArr

  • 问题内容: 我需要从一些文本文件中选择一些数字。我可以使用grep选择所需的行,但是不知道如何从行中提取数字。一位同事向我展示了如何使用Perl从bash中做到这一点: 但是,我通常使用Python而不是Perl进行编码。所以我的问题是,我可以用相同的方式使用Python吗?即,我可以将一些东西从bash传递到Python,然后直接将结果传递到stdout吗?…如果有道理。还是在这种情况下Perl

  • 我是一名普通的C#开发人员,但偶尔会用Java开发应用程序。我想知道是否有与C#async/await相当的Java?简单地说,java等价物是什么:

  • 等价 cljs 的数据结构是在 js 基础之上实现的. 数值类型的数据可以直接判断. 一般通过 (= a b) 判断 a 和 b 的内容是否一致. Collection 类型数据除了 = 函数之外, 还可以使用 identical? 函数判断两个数据的引用是否一致. (identical? {} {}) ; true (identical? {:a 1} {:a 1}) ; false (= {:

  • 问题内容: 这个问题可能背叛了一个误解,但是我很好奇Python世界的“ Tomcat”是什么。 我所有的Web编程经验都是Java(或Groovy),因此我认为是Java。当我想到制作一个基本的Web应用程序时,我想到了编写一些servlet,构建WAR文件并将其部署在Tomcat或另一个servlet容器中。 在Python中,假设我编写了一些能够响应HTTP请求的代码,我该怎么办?我将如何部

  • 问题内容: Golang 中python的chr()和ord()函数的等效项是什么? 问题答案: 支持它们作为简单转换: 输出(在Go Playground上尝试): 注意:您还可以将整数转换为基本上将整数解释为UTF-8编码值的: 将有符号或无符号整数值转换为字符串类型会产生一个包含该整数的UTF-8表示形式的字符串。有效Unicode代码点范围之外的值将转换为。