将对象属性列表加入String

我现在正在学习lambda,我想知道如何用lambda的单行编写这段代码。

我有一个Person类,其中包含IDname字段

目前,我有一个List存储这些Person对象。 我想要完成的是获取一个由人的id组成的字符串。

“id1,id2,id3”

我怎样才能用lambda实现这个目标?

要检索由分隔符","分隔的所有ID组成的String ","首先必须将Person ID map到新流,然后可以应用Collectors.joining

 String result = personList.stream().map(Person::getId) .collect(Collectors.joining(",")); 

如果您的ID字段不是String而是int或其他原始数字类型,那么您应该使用以下解决方案:

 String result = personList.stream().map(p -> String.valueOf(p.getId())) .collect(Collectors.joining(",")); 

流映射,并收集列表!

 List myListofPersons = personList.stream() .map(Person::getId) .collect(Collectors.toList()); 

如果你需要在String对象中,那么加入列表

 String res = String.join(" , ", myListStringId); System.out.println(res); 

稍微过度设计,但有助于更频繁地发生此问题(特别是如果使用默认映射器和分隔符添加委托给此方法的重载方法):

 /** * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression. * @return a list of the values' string representation according to mapper, separated by the specified * string. Null if list is null or empty. */ public static  String toListString(Collection list, String separator, Function mapper) { if (list == null || list.isEmpty()) { return null; } return list.stream() .map(mapper) .collect(Collectors.joining(separator)); } 

和适当的反函数:

 /** * @param list a list of values, separated by the specified separator * @param separator used to join the values. NOTE: the separator is interpreted as a regular expression. * @param mapper the function to map a single string to a value. * @return a list of the values. Empty if string is null or empty. */ public static  List fromListString(String list, String separator, Function mapper) { if (list == null || list.isEmpty()) { return new ArrayList<>(); } return Arrays.stream(list.trim().split(separator)) .map(mapper) .collect(Collectors.toCollection(ArrayList::new)); } 

如果性能是一个问题,我会选择经典的循环方法:

  StringBuilder s = new StringBuilder(); for(R r : list){ if (s.length() != 0) s.append(separator); s.append(mapper.apply(r)); } return s.toString(); 

和:

  List result = new ArrayList<>(); for (String s : list.trim().split(separator)){ result.add(mapper.apply(s)); } return result; 

您还可以使用Collectors#mapping如下:

 String ids = personList.stream().collect(mapping(Person::getId , Collectors.joining(","))); 

或者 Person.ID不是CharSequence的实例,那么你需要双映射如下:

 String ids = personList.stream().collect(mapping(Person::getId , mapping(String::valueOf , Collectors.joining(","))));