【问题标题】:Method Reference for Integer type List整数类型列表的方法参考
【发布时间】:2018-09-27 08:44:55
【问题描述】:

我有如下代码。

List<Integer> parameters = ...

String string = " NOT IN (" + 
    parameters.stream()
              .map(parameter -> parameter.toString())
              .collect(Collectors.joining(",")) 
+ ") ";

我想将 parameter -> parameter.toString() lambda 表达式转换为方法引用。

【问题讨论】:

  • String::valueOf 我认为会这样做,但有些 SQL 允许使用 SQL 数组的 PreparedStatement NOT IN(?):connection.createArray。这将取决于供应商,但更好的 IMO。
  • String string = parameters.stream() .map(Object::toString) .collect(Collectors.joining(",", " NOT IN (", ") "));

标签: java string list java-8 java-stream


【解决方案1】:

只需在您的类中定义一个toString 方法,例如Parameter,您就可以将它用作流中的方法引用:

parameters.stream().map(Parameter::toString).collect(Collectors.joining(",")) 

如果你没有具体的班级,而且你使用Integer类型作为列表,直接使用Object::toString就可以了。

我的回答旨在涵盖一般情况,即使用任何方法处理用户定义类的情况。

【讨论】:

  • 示例中没有Parameter 类——它是Integers 的列表。但是,toString() 是在 Object 上定义的,所以 Integer::toStringObject::toString 都可以。
  • 同意@ohlec。请编辑您对以下内容的回答 - parameters.stream().map(Object::toString).collect(Collectors.joining(","))
  • Integer::toString 由于过载而无法工作,但Object::toString 可以正常工作。
  • @talex 啊,我明白了——因为整数的静态 toString 变体造成了歧义。
  • 这个答案不正确。来源是List&lt;Integer&gt; parameters。 OP 适用于 List&lt;Integer&gt; 而不是 List&lt;Parameter&gt;
【解决方案2】:

由于parametersList&lt;Integer&gt;,您可能需要:

parameters.stream().map(i -> i.toString()).collect(Collectors.joining(","));

问题

但是,使用引用方法有点问题,因为Integer 定义了三个称为toString 的方法:

所以像下面这样使用方法引用会导致:

parameters.stream().map(Integer::toString).collect(Collectors.joining(","));

不明确的方法参考:来自 Integer 类型的 toString() 和 toString(int) 都符合条件

解决方案

在这种情况下,您可以使用 Number 类,它是 Integer 的父类,其方法 Number::toString 完全相同:

parameters.stream().map(Number::toString).collect(Collectors.joining(","));

【讨论】:

  • 我的回答有什么不正确的吗?我欢迎提供反馈和不赞成投票的原因...
【解决方案3】:

使用这个:

List<Integer> parameters = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8);

    String string = parameters.stream()
            .map(Object::toString)
            .collect(Collectors.joining(", ", " NOT IN (", ") "));
System.out.println(string);

不需要为你连接StringCollectors.joining

结果:

NOT IN (1, 2, 3, 4, 5, 6, 7, 8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多