小编use*_*860的帖子

Java 8泛型:将消费者流量减少到单个消费者

我怎么能写组合的方法StreamConsumers到一个单一的Consumer使用Consumer.andThen(Consumer)

我的第一个版本是:

<T> Consumer<T> combine(Stream<Consumer<T>> consumers) {
    return consumers
            .filter(Objects::nonNull)
            .reduce(Consumer::andThen)
            .orElse(noOpConsumer());
}

<T> Consumer<T> noOpConsumer() {
    return value -> { /* do nothing */ };
}
Run Code Online (Sandbox Code Playgroud)

此版本使用JavaC和Eclipse编译.但它太具体了:Stream不能是a Stream<SpecialConsumer>,如果Consumers不是类型T而是超类型,则不能使用:

Stream<? extends Consumer<? super Foo>> consumers = ... ;
combine(consumers);
Run Code Online (Sandbox Code Playgroud)

这不会合理地编译.改进版将是:

<T> Consumer<T> combine(Stream<? extends Consumer<? super T>> consumers) {
    return consumers
            .filter(Objects::nonNull)
            .reduce(Consumer::andThen)
            .orElse(noOpConsumer());
}
Run Code Online (Sandbox Code Playgroud)

但Eclipse和JavaC都没有编译:
Eclipse(4.7.3a):

该类型Consumer未定义andThen(capture#7-of ? extends Consumer<? super …

java generics java-8 java-stream

31
推荐指数
1
解决办法
1498
查看次数

规范是否保证顺序Java流上的操作必须保留在当前线程中?

规范是否保证顺序 Java Streams 上的所有操作都在当前线程中执行?("forEach"和"forEachOrdered"除外)

我明确要求规范,而不是当前的实现.我可以自己查看当前的实现,不需要打扰你.但实现可能会改变,还有其他实现.

我问因为ThreadLocals:我使用的是一个内部使用ThreadLocals的Framework.即使像company.getName()这样的简单调用最终也会使用ThreadLocal.我无法改变该框架的设计方式.至少不在理智的时间内.

这里的规范似乎令人困惑.包"java.util.stream"的文档说明:

如果行为参数确实有副作用,除非明确说明,否则不能保证这些副作用对其他线程的可见性,也不保证同一流管道中"相同"元素的不同操作在同一个线程中执行.

...

即使当管道被约束以产生结果,其与流源的遭遇顺序一致(例如,IntStream.range(0,5).parallel()地图(X - > X*2).toArray( )必须产生[0,2,4,6,8]),不能保证制成,以作为对于所述映射器函数被应用到各个元件,或为了在什么螺纹任何行为参数被执行对于给定的元件.

我将其解释为:流上的每个操作都可以在不同的线程中发生.但是"forEach"和"forEachOrdered"的文档明确指出:

对于任何给定元素,可以在任何时间以及库选择的任何线程中执行该动作.

如果每个流操作都可能发生在未指定的线程中,那么该语句将是多余的.因此恰恰相反:串行流上的所有操作都保证在当前线程中执行,除了"forEach"和"forEachOrdered"?

我搜索了关于"Java","Stream"和"ThreadLocal"组合的权威答案,但没有发现任何内容.该关闭的事情是由一个答案作者Brian Goetz在这里对堆栈溢出一个相关的问题,但它是有关订单,而不是线程,它只是对"的forEach",而不是其他流的方法:是否Stream.forEach尊重遇到顺序流的顺序?

java thread-local java-8 java-stream

15
推荐指数
1
解决办法
264
查看次数

在编译时获取Class <T>?

在Java中,您可以编写:

Class<SomeClass> foo = SomeClass.class;
Run Code Online (Sandbox Code Playgroud)

我正在玩Scala并想要更多:我希望在编译时获得一个Method(及其泛型类型),如下所示:

val foo : Method[...] = SomeClass.class.someMethod
Run Code Online (Sandbox Code Playgroud)

甚至:

val foo : Method[...] = someObject.class.someMethod
Run Code Online (Sandbox Code Playgroud)

有没有办法在Scala中做这样的事情?

reflection scala compile-time

4
推荐指数
1
解决办法
779
查看次数