我有如下代码。
List<Integer> parameters = ...
String string = " NOT IN (" +
parameters.stream()
.map(parameter -> parameter.toString())
.collect(Collectors.joining(","))
+ ") ";
我想将参数-> parameter.toString()lambda表达式转换为方法引用。
答案 0 :(得分:2)
只需在您的类中定义一个toString
方法,例如Parameter
,您就可以将其用作流中的方法引用:
parameters.stream().map(Parameter::toString).collect(Collectors.joining(","))
如果您没有特定的班级,并且您使用Integer
类型作为列表,请直接使用Object::toString
,如同事在评论中建议的那样。
我的答案旨在涵盖一般情况,即使用任何方法处理用户定义的类的情况。
答案 1 :(得分:1)
由于parameters
是List<Integer>
,因此您可能需要:
parameters.stream().map(i -> i.toString()).collect(Collectors.joining(","));
问题
但是,由于引用方法Integer
定义了三个称为toString
的方法,因此存在一些问题:
toString()
返回代表此Integer值的String对象。static toString(int i)
返回代表指定整数的String对象。static toString(int i, int radix)
返回第二个参数指定的基数中第一个参数的字符串表示形式。因此使用如下所示的方法引用将导致:
parameters.stream().map(Integer::toString).collect(Collectors.joining(","));
方法参考不明确:Integer类型的toString()和toString(int)均符合条件
解决方案
在这种情况下,可以使用Number
的父类Integer
及其方法Number::toString
,它们的作用完全相同:
parameters.stream().map(Number::toString).collect(Collectors.joining(","));
答案 2 :(得分:0)
使用此:
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);
不需要连接String
,Collectors.joining
可以为您完成此操作。
结果:
NOT IN (1, 2, 3, 4, 5, 6, 7, 8)