代码之家  ›  专栏  ›  技术社区  ›  L.Spillner

在流#flatMap中使用java.util.Function#identity时出现编译时错误(函数<T,流<R>>)

  •  0
  • L.Spillner  · 技术社区  · 3 年前

    圣诞快乐,

    我在修改一些java.util.Stream时,一些不规则的行为引起了我的注意。 我只是想把一个包含几个整数值流的列表压平,比如这个例子:

    List<Stream> list = new ArrayList<>();
    list.add(Stream.of( 1,2 ));
    list.add(Stream.of( 3,4 ));
    
    list.stream().flatMap( s -> s ).forEach( System.out::println );
    

    这个最小的代码片段工作起来没有任何问题。 通常当我看到lambda表达式时 s -> s 我想我可以简单地用 java.util.Function#identity() 由于它几乎是一样的,但在这样做的过程中,我遇到了这个编译时问题:

    D:\Development\Java\Playground\src\Main.java:15:30
    java: incompatible types: cannot infer type-variable(s) R,T
        (argument mismatch; java.util.function.Function<java.util.stream.Stream,java.util.stream.Stream> cannot be converted to java.util.function.Function<? super java.util.stream.Stream,? extends java.util.stream.Stream<? extends java.lang.Object>>)
    

    我自己无法完全解释使用之间的区别 java.util.Function#identity() s->s 。那么,为什么会出现这种编译时问题呢?我的猜测是这与类型擦除有关,但我不确定,也无法自己解释。

    我使用的是OpenJDK v16.0.1。

    0 回复  |  直到 3 年前
        1
  •  0
  •   WJS    3 年前

    也许这就是你想要的。类型应为 Stream<Integer>

    List<Stream<Integer>> list = new ArrayList<>();
    list.add(Stream.of( 1,2 ));
    list.add(Stream.of( 3,4 ));
    
    list.stream().flatMap( s -> s ).forEach( System.out::println );
    

    打印

    1
    2
    3
    4
            
    
    推荐文章