如何使用方法引用/Java8泛化实用函数

如何使用方法引用/Java8泛化实用函数,java,java-8,Java,Java 8,我遇到了一种常见的情况,即我有一个对象列表,需要生成一个逗号分隔的字符串,其中包含一个属性,然后每个属性都用单引号括起来 2个例子 public String partIDsToString(List<Part> parts){ StringBuilder sb = new StringBuilder(); for(Part part : parts) sb.append("'"+part.getPartNumber() + "',"); re

我遇到了一种常见的情况,即我有一个对象列表,需要生成一个逗号分隔的字符串,其中包含一个属性,然后每个属性都用单引号括起来

2个例子

public String partIDsToString(List<Part> parts){
    StringBuilder sb = new StringBuilder();
    for(Part part : parts)
        sb.append("'"+part.getPartNumber() + "',");
    return sb.substring(0,sb.length()-1);
}

public String companyIDsToString(List<Company> parts){
    StringBuilder sb = new StringBuilder();
    for(Company c : parts)
        sb.append("'"+c.getId() + "',");
    return sb.substring(0,sb.length()-1);
}
公共字符串分区排序(列出部分){
StringBuilder sb=新的StringBuilder();
用于(零件:零件)
sb.append(“'”+part.getPartNumber()+“'”,”);
返回sb.子字符串(0,sb.length()-1);
}
公共字符串公司排序(列出部分){
StringBuilder sb=新的StringBuilder();
适用于(c公司:零件)
sb.追加(““+c.getId()+”,”);
返回sb.子字符串(0,sb.length()-1);
}
我需要在将来创建更多类似的方法,我想知道是否有一种方法可以推广这个功能,我正在寻找类似的方法

public String objectPropertyToString(List<Object> list, Method getProperty){
    StringBuilder sb = new StringBuilder();
    for(Object obj: list)
        sb.append("'"+obj.getProperty() + "',");
    return sb.substring(0,sb.length()-1);
}

List<Company> companies = getCompaniesList();//not important
String result = objectPropertyToString(companies , Company::getId);

List<Part> parts= getPartsList();//not important
String result = objectPropertyToString(parts, Part::getPartNumber);
公共字符串objectPropertyToString(列表,方法getProperty){
StringBuilder sb=新的StringBuilder();
对于(对象对象:列表)
sb.append(“”+obj.getProperty()+“,”);
返回sb.子字符串(0,sb.length()-1);
}
列出公司=GetCompanyList()//不重要
字符串结果=objectPropertyToString(公司,公司::getId);
列出零件=getPartsList()//不重要
字符串结果=objectPropertyToString(零件,零件::getPartNumber);
这可以通过方法引用/lambdas或任何其他方式来完成吗?

这里是您的朋友

companies.stream()
         .map(Company::getId)
         .map(s -> "'" + s + "'")
         .collect(joining(","));
您可以创建一个helper方法,但根据我的判断,上述方法足够简洁,不值得:

static <T> String mapAndJoin(Collection<T> c, Function<T,String> f){
    return c.stream()
            .map(f)
            .map(s -> "'" + s + "'")
            .collect(joining(","));
}

mapAndJoin(companies, Company::getId);
静态字符串mapAndJoin(集合c,函数f){
返回c.stream()
.地图(f)
.map(s->“'+s+”))
.收取(加入(“,”);
}
mapAndJoin(公司,公司::getId);
如中所示,
收集器。加入
可用于生成逗号分隔符列表。但您也可以使用它一次性将元素用单引号括起来,这比在加入元素之前对每个元素进行单独的字符串操作更有效

基本思路如下:

public static <T> String objectPropertyToString(
                  Collection<? extends T> list, Function<T,String> f) {
    return list.stream().map(f).collect(Collectors.joining("', '", "'", "'"));
}
这基本上与前面的尝试相同,但值得注意的是,我们现在可以使用
setEmptyValue
为没有元素的情况指定不同的结果。作为奖励,我们现在可以放松泛型类型签名,允许加入任意
CharSequence
实例,而不仅仅是
String
s

用法如前所述:

List<Company> companies = getCompaniesList();//not important
String result = objectPropertyToString(companies , Company::getId);

List<Part> parts= getPartsList();//not important
String result = objectPropertyToString(parts, Part::getPartNumber);
List companies=getCompaniesList()//不重要
字符串结果=objectPropertyToString(公司,公司::getId);
列出零件=getPartsList()//不重要
字符串结果=objectPropertyToString(零件,零件::getPartNumber);

谢谢,这正是我想要的。
List<Company> companies = getCompaniesList();//not important
String result = objectPropertyToString(companies , Company::getId);

List<Part> parts= getPartsList();//not important
String result = objectPropertyToString(parts, Part::getPartNumber);