代码之家  ›  专栏  ›  技术社区  ›  fastcodejava

将此lambda替换为方法引用[重复]

  •  9
  • fastcodejava  · 技术社区  · 6 年前

    我有以下代码。声纳抱怨用一个方法参考代替这个lambda。

    Stream.iterate(0, i -> i + 1).limit(100).map(i -> Integer.toString(i));
    

    如果将其替换为下面的代码,则编译时不会出现编译错误:类型不匹配:无法从 Stream<Object> <unknown> .

    Stream.iterate(0, i -> i + 1).limit(100).map(Integer::toString);
    

    怎么样 Integer::toString 转换 流<对象> <未知> ?

    4 回复  |  直到 6 年前
        1
  •  8
  •   shmosel    6 年前

    这是模棱两可的,因为 static non-static toString() 方法都与函数签名兼容 Integer -> String . 你可以用 String::valueOf 相反。

        2
  •  5
  •   codeformars    6 年前

    你不能把 Integer::toString 因为 Integer 有两个适合功能接口的实现 Function<Integer, String> ,但您可以使用 String::valueOf 相反:

    Stream.iterate(0, i -> i + 1)
            .limit(100)
            .map(String::valueOf)
            .collect(Collectors.toList())
    
        3
  •  2
  •   Ousmane D.    6 年前

    正如@shmosel所提到的,已经用方法引用替换lambda将导致歧义,因为 toString 签字方法:

    因为打电话给 Stream.iterate(0, i -> i + 1) 返回 Stream<Integer> 当你打电话 map 方法参考 Integer::toString 编译器不确定您是否打算这样做 Integer.toString(i) i.toString() 因此出现编译错误。

    因此,对于已经提供的内容,这里还有其他选择:

    而不是 Stream.iterate 你可以用 IntStream.iterate 然后打电话 mapToObj :

    IntStream.iterate(0, i -> i + 1) // IntStream
             .limit(100) // IntStream
             .mapToObj(Integer::toString); // i1 -> Integer.toString(i1)
    

    另一个建议是 intelliJ 你真的可以做到:

    Stream.iterate(0, i -> i + 1) // Stream<Integer>
          .limit(100) // Stream<Integer>
          .map(Object::toString); // integer -> integer.toString()
    

    哪里 Object::toString 相当于lambda integer -> integer.toString()


    另一方面,有意思的是,Sonar建议在您展示的代码中用方法引用替换lambda。intelliJ的想法很聪明,不建议这么做。

        4
  •  0
  •   Oleg Cherednik    6 年前

    我想是的 IntStream 更适合您的代码:

    List<String> numbers = IntStream.range(0, 100)
                                    .mapToObj(String::valueOf)
                                    .collect(Collectors.toList());
    

    或者以你为例 String.valueOf 转换 int -> String :

    List<String> numbers = Stream.iterate(0, i -> i + 1)
                                 .limit(100)
                                 .map(String::valueOf)
                                 .collect(Collectors.toList());